Column Type Reference
Use KColumnType
KColumnType is the enum accepted by @ColumnType. Use it on a KPojo property to choose the DDL type that table operations render for the current database dialect.
import com.kotlinorm.annotations.ColumnType
import com.kotlinorm.annotations.Table
import com.kotlinorm.enums.KColumnType
import com.kotlinorm.interfaces.KPojo
@Table("tb_column_type_catalog")
data class ColumnTypeCatalog(
@ColumnType(KColumnType.VARCHAR, length = 64)
var code: String? = null,
) : KPojo
val code = ColumnTypeCatalog().__columns.single { it.name == "code" }Result:
| Field metadata | Value |
|---|---|
code.type | KColumnType.VARCHAR |
code.length | 64 |
code.scale | 0 |
Text And UUID Types
Use string-like KColumnType values for short text, long text, and UUID values.
import com.kotlinorm.annotations.ColumnType
import com.kotlinorm.annotations.Table
import com.kotlinorm.enums.KColumnType
import com.kotlinorm.interfaces.KPojo
@Table("tb_text_type")
data class TextType(
@ColumnType(KColumnType.VARCHAR, length = 64)
var code: String? = null,
@ColumnType(KColumnType.TEXT)
var description: String? = null,
@ColumnType(KColumnType.UUID)
var externalId: String? = null,
) : KPojoDDL type fragments:
| Dialect | code | description | externalId |
|---|---|---|---|
| MySQL | VARCHAR(64) | TEXT | CHAR(36) |
| PostgreSQL | VARCHAR(64) | TEXT | UUID |
| SQLite | TEXT | TEXT | TEXT |
| H2 | VARCHAR(64) | CLOB | UUID |
| SQLServer | VARCHAR(64) | TEXT | CHAR(36) |
| Oracle | VARCHAR2(64) | CLOB | CHAR(36) |
| DM8 | VARCHAR2(64) | CLOB | CHAR(36) |
Numeric Types
Use numeric KColumnType values for booleans, integers, and exact decimal values.
import com.kotlinorm.annotations.ColumnType
import com.kotlinorm.annotations.Table
import com.kotlinorm.enums.KColumnType
import com.kotlinorm.interfaces.KPojo
import java.math.BigDecimal
@Table("tb_numeric_type")
data class NumericType(
@ColumnType(KColumnType.BIT)
var active: Boolean? = null,
@ColumnType(KColumnType.BIGINT)
var visits: Long? = null,
@ColumnType(KColumnType.DECIMAL, length = 12, scale = 4)
var balance: BigDecimal? = null,
) : KPojoDDL type fragments:
| Dialect | active | visits | balance |
|---|---|---|---|
| MySQL | TINYINT(1) | BIGINT(20) | DECIMAL(12,4) |
| PostgreSQL | BOOLEAN | BIGINT | DECIMAL(12,4) |
| SQLite | INTEGER | INTEGER | NUMERIC |
| H2 | BOOLEAN | BIGINT | NUMERIC(12,4) |
| SQLServer | BIT | BIGINT | DECIMAL(12,4) |
| Oracle | NUMBER(1) | NUMBER(19) | NUMBER(12,4) |
| DM8 | NUMBER(1) | NUMBER(19) | NUMBER(12,4) |
Date And Time Types
Use temporal KColumnType values for date, time, datetime, and timestamp columns. scale controls fractional-second precision where the dialect uses it.
import com.kotlinorm.annotations.ColumnType
import com.kotlinorm.annotations.Table
import com.kotlinorm.enums.KColumnType
import com.kotlinorm.interfaces.KPojo
import java.sql.Timestamp
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.LocalTime
@Table("tb_temporal_type")
data class TemporalType(
@ColumnType(KColumnType.DATE)
var eventDate: LocalDate? = null,
@ColumnType(KColumnType.TIME)
var eventTime: LocalTime? = null,
@ColumnType(KColumnType.DATETIME)
var createdAt: LocalDateTime? = null,
@ColumnType(KColumnType.TIMESTAMP, scale = 4)
var touchedAt: Timestamp? = null,
) : KPojoDDL type fragments:
| Dialect | eventDate | eventTime | createdAt | touchedAt |
|---|---|---|---|---|
| MySQL | DATE | TIME | DATETIME | TIMESTAMP |
| PostgreSQL | DATE | TIME(0) | TIMESTAMP(0) | TIMESTAMP(4) |
| SQLite | TEXT | TEXT | TEXT | TEXT |
| H2 | DATE | TIME | TIMESTAMP | TIMESTAMP(4) |
| SQLServer | DATE | TIME | DATETIME | TIMESTAMP |
| Oracle | DATE | TIMESTAMP(0) | TIMESTAMP(6) | TIMESTAMP(4) |
| DM8 | DATE | TIMESTAMP(0) | TIMESTAMP(6) | TIMESTAMP(4) |
JSON, Binary, Spatial, And XML Types
@Serialize encodes an object as JSON text. When the database column should use its JSON type, add @ColumnType(KColumnType.JSON) to generate that DDL. Binary, spatial, and XML values follow the same @ColumnType pattern.
import com.kotlinorm.annotations.ColumnType
import com.kotlinorm.annotations.Serialize
import com.kotlinorm.annotations.Table
import com.kotlinorm.enums.KColumnType
import com.kotlinorm.interfaces.KPojo
data class AuditPayload(val ip: String, val tags: List<String>)
@Table("tb_document_type")
data class DocumentType(
@ColumnType(KColumnType.JSON)
@Serialize
var payload: AuditPayload? = null,
@ColumnType(KColumnType.BLOB)
var attachment: ByteArray? = null,
@ColumnType(KColumnType.POINT)
var position: String? = null,
@ColumnType(KColumnType.XML)
var document: String? = null,
) : KPojoDDL type fragments:
| Dialect | payload | attachment | position | document |
|---|---|---|---|---|
| MySQL | JSON | BLOB | POINT | TEXT |
| PostgreSQL | JSONB | BYTEA | POINT | XML |
| SQLite | TEXT | BLOB | TEXT | TEXT |
| H2 | JSON | BLOB | POINT | XML |
| SQLServer | JSON | VARBINARY(MAX) | GEOMETRY | XML |
| Oracle | JSON | BLOB | SDO_GEOMETRY | XMLType |
| DM8 | JSON | BLOB | SDO_GEOMETRY | XMLType |
Compact Reference
This table shows the type strings rendered by table DDL for common KColumnType values. Cells with n, p, or s use length and scale from @ColumnType; decimal and numeric cells with p render p,0 when only length is set.
KColumnType | MySQL | PostgreSQL | SQLite | H2 | SQLServer | Oracle | DM8 |
|---|---|---|---|---|---|---|---|
BIT | TINYINT(1) | BOOLEAN | INTEGER | BOOLEAN | BIT | NUMBER(1) | NUMBER(1) |
TINYINT | TINYINT(4) | SMALLINT | INTEGER | TINYINT | TINYINT | NUMBER(3) | NUMBER(3) |
SMALLINT | SMALLINT(6) | SMALLINT | INTEGER | SMALLINT | SMALLINT | NUMBER(5) | NUMBER(5) |
MEDIUMINT | MEDIUMINT(9) | INTEGER | INTEGER | INTEGER | INT | NUMBER(7) | NUMBER(7) |
INT | INT(11) | INTEGER | INTEGER | INTEGER | INT | NUMBER(10) | NUMBER(10) |
BIGINT | BIGINT(20) | BIGINT | INTEGER | BIGINT | BIGINT | NUMBER(19) | NUMBER(19) |
SERIAL | INT(11) | SERIAL | INTEGER | INTEGER | INT | NUMBER | NUMBER |
YEAR | YEAR | INTEGER | INTEGER | INTEGER | INT | NUMBER(4) | NUMBER(4) |
REAL | REAL | REAL | REAL | REAL | REAL | BINARY_FLOAT | BINARY_FLOAT |
FLOAT | FLOAT or FLOAT(p,s) | DOUBLE PRECISION or FLOAT(p) | REAL | DOUBLE PRECISION | FLOAT or FLOAT(p) | BINARY_DOUBLE or FLOAT(p) | BINARY_DOUBLE or FLOAT(p) |
DOUBLE | DOUBLE or DOUBLE(p,s) | DOUBLE PRECISION | REAL | DOUBLE PRECISION | FLOAT(53) | BINARY_DOUBLE | BINARY_DOUBLE |
DECIMAL | DECIMAL(10,0) or DECIMAL(p,s) | DECIMAL or DECIMAL(p,s) | NUMERIC | NUMERIC or NUMERIC(p,0) or NUMERIC(p,s) | DECIMAL(18,0) or DECIMAL(p,s) | NUMBER(10,0) or NUMBER(p,s) | NUMBER(10,0) or NUMBER(p,s) |
NUMERIC | NUMERIC(10,0) or NUMERIC(p,s) | NUMERIC or NUMERIC(p,s) | NUMERIC | NUMERIC or NUMERIC(p,0) or NUMERIC(p,s) | NUMERIC(18,0) or NUMERIC(p,s) | NUMERIC(10,0) or NUMERIC(p,s) | NUMERIC(10,0) or NUMERIC(p,s) |
CHAR | CHAR(255) or CHAR(n) | CHAR(255) or CHAR(n) | TEXT | CHAR(255) or CHAR(n) | CHAR(255) or CHAR(n) | CHAR(255) or CHAR(n) | CHAR(255) or CHAR(n) |
VARCHAR | VARCHAR(255) or VARCHAR(n) | TEXT or VARCHAR(n) | TEXT | VARCHAR(255) or VARCHAR(n) | VARCHAR(255) or VARCHAR(n/MAX) | VARCHAR2(255) or VARCHAR2(n) | VARCHAR2(255) or VARCHAR2(n) |
NCHAR | CHAR(255) or CHAR(n) | CHAR(255) or CHAR(n) | TEXT | CHAR(255) or CHAR(n) | NVARCHAR(255) or NVARCHAR(n) | NCHAR(255) or NCHAR(n) | NCHAR(255) or NCHAR(n) |
NVARCHAR | VARCHAR(255) or VARCHAR(n) | TEXT or VARCHAR(n) | TEXT | VARCHAR(255) or VARCHAR(n) | NVARCHAR(255) or NVARCHAR(n/MAX) | NVARCHAR2(255) or NVARCHAR2(n) | NVARCHAR2(255) or NVARCHAR2(n) |
TEXT | TEXT | TEXT | TEXT | CLOB | TEXT | CLOB | CLOB |
MEDIUMTEXT | MEDIUMTEXT | TEXT | TEXT | CLOB | TEXT | CLOB | CLOB |
LONGTEXT | LONGTEXT | TEXT | TEXT | CLOB | TEXT | CLOB | CLOB |
CLOB | CLOB | TEXT | TEXT | CLOB | TEXT | CLOB | CLOB |
NCLOB | NCLOB | TEXT | TEXT | CLOB | NTEXT | NCLOB | NCLOB |
DATE | DATE | DATE | TEXT | DATE | DATE | DATE | DATE |
TIME | TIME | TIME(0-6) | TEXT | TIME or TIME(s) | TIME or TIME(s) | TIMESTAMP(0) | TIMESTAMP(0) |
DATETIME | DATETIME | TIMESTAMP(0-6) | TEXT | TIMESTAMP or TIMESTAMP(s) | DATETIME or DATETIME2(s) | TIMESTAMP(6) | TIMESTAMP(6) |
TIMESTAMP | TIMESTAMP | TIMESTAMP(0-6) | TEXT | TIMESTAMP or TIMESTAMP(s) | TIMESTAMP | TIMESTAMP(0-9) | TIMESTAMP(0-9) |
BINARY | BINARY(255) or BINARY(n) | BYTEA | BLOB | BINARY(255) or BINARY(n) | BINARY(255) or BINARY(n) | RAW(2000) or RAW(n) | RAW(2000) or RAW(n) |
VARBINARY | VARBINARY(255) or VARBINARY(n) | BYTEA | BLOB | VARBINARY(255) or VARBINARY(n) | VARBINARY(255) or VARBINARY(n) | RAW(2000) or RAW(n) | RAW(2000) or RAW(n) |
LONGVARBINARY | LONGBLOB | BYTEA | BLOB | BLOB | VARBINARY(MAX) | BLOB | BLOB |
BLOB | BLOB | BYTEA | BLOB | BLOB | VARBINARY(MAX) | BLOB | BLOB |
MEDIUMBLOB | MEDIUMBLOB | BYTEA | BLOB | BLOB | VARBINARY(MAX) | BLOB | BLOB |
LONGBLOB | LONGBLOB | BYTEA | BLOB | BLOB | VARBINARY(MAX) | BLOB | BLOB |
JSON | JSON | JSONB | TEXT | JSON | JSON | JSON | JSON |
ENUM | ENUM | VARCHAR(255) or VARCHAR(n) | TEXT | VARCHAR(255) or VARCHAR(n) | NVARCHAR(255) | VARCHAR2(255) | VARCHAR2(255) |
SET | SET | TEXT | INTEGER | VARCHAR(255) or VARCHAR(n) | NVARCHAR(255) | VARCHAR2(1000) | VARCHAR2(1000) |
UUID | CHAR(36) | UUID | TEXT | UUID | CHAR(36) | CHAR(36) | CHAR(36) |
GEOMETRY | GEOMETRY | GEOMETRY | TEXT | GEOMETRY | GEOMETRY | SDO_GEOMETRY | SDO_GEOMETRY |
POINT | POINT | POINT | TEXT | POINT | GEOMETRY | SDO_GEOMETRY | SDO_GEOMETRY |
LINESTRING | LINESTRING | LINESTRING | TEXT | LINESTRING | GEOMETRY | SDO_GEOMETRY | SDO_GEOMETRY |
XML | TEXT | XML | TEXT | XML | XML | XMLType | XMLType |
Automatic Kotlin type inference is covered in
📚Kotlin Type To KColumnType.@ColumnTypeis the user-facing API for choosing a different enum value.