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 metadataValue
code.typeKColumnType.VARCHAR
code.length64
code.scale0

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,
) : KPojo

DDL type fragments:

DialectcodedescriptionexternalId
MySQLVARCHAR(64)TEXTCHAR(36)
PostgreSQLVARCHAR(64)TEXTUUID
SQLiteTEXTTEXTTEXT
H2VARCHAR(64)CLOBUUID
SQLServerVARCHAR(64)TEXTCHAR(36)
OracleVARCHAR2(64)CLOBCHAR(36)
DM8VARCHAR2(64)CLOBCHAR(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,
) : KPojo

DDL type fragments:

Dialectactivevisitsbalance
MySQLTINYINT(1)BIGINT(20)DECIMAL(12,4)
PostgreSQLBOOLEANBIGINTDECIMAL(12,4)
SQLiteINTEGERINTEGERNUMERIC
H2BOOLEANBIGINTNUMERIC(12,4)
SQLServerBITBIGINTDECIMAL(12,4)
OracleNUMBER(1)NUMBER(19)NUMBER(12,4)
DM8NUMBER(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,
) : KPojo

DDL type fragments:

DialecteventDateeventTimecreatedAttouchedAt
MySQLDATETIMEDATETIMETIMESTAMP
PostgreSQLDATETIME(0)TIMESTAMP(0)TIMESTAMP(4)
SQLiteTEXTTEXTTEXTTEXT
H2DATETIMETIMESTAMPTIMESTAMP(4)
SQLServerDATETIMEDATETIMETIMESTAMP
OracleDATETIMESTAMP(0)TIMESTAMP(6)TIMESTAMP(4)
DM8DATETIMESTAMP(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,
) : KPojo

DDL type fragments:

Dialectpayloadattachmentpositiondocument
MySQLJSONBLOBPOINTTEXT
PostgreSQLJSONBBYTEAPOINTXML
SQLiteTEXTBLOBTEXTTEXT
H2JSONBLOBPOINTXML
SQLServerJSONVARBINARY(MAX)GEOMETRYXML
OracleJSONBLOBSDO_GEOMETRYXMLType
DM8JSONBLOBSDO_GEOMETRYXMLType

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.

KColumnTypeMySQLPostgreSQLSQLiteH2SQLServerOracleDM8
BITTINYINT(1)BOOLEANINTEGERBOOLEANBITNUMBER(1)NUMBER(1)
TINYINTTINYINT(4)SMALLINTINTEGERTINYINTTINYINTNUMBER(3)NUMBER(3)
SMALLINTSMALLINT(6)SMALLINTINTEGERSMALLINTSMALLINTNUMBER(5)NUMBER(5)
MEDIUMINTMEDIUMINT(9)INTEGERINTEGERINTEGERINTNUMBER(7)NUMBER(7)
INTINT(11)INTEGERINTEGERINTEGERINTNUMBER(10)NUMBER(10)
BIGINTBIGINT(20)BIGINTINTEGERBIGINTBIGINTNUMBER(19)NUMBER(19)
SERIALINT(11)SERIALINTEGERINTEGERINTNUMBERNUMBER
YEARYEARINTEGERINTEGERINTEGERINTNUMBER(4)NUMBER(4)
REALREALREALREALREALREALBINARY_FLOATBINARY_FLOAT
FLOATFLOAT or FLOAT(p,s)DOUBLE PRECISION or FLOAT(p)REALDOUBLE PRECISIONFLOAT or FLOAT(p)BINARY_DOUBLE or FLOAT(p)BINARY_DOUBLE or FLOAT(p)
DOUBLEDOUBLE or DOUBLE(p,s)DOUBLE PRECISIONREALDOUBLE PRECISIONFLOAT(53)BINARY_DOUBLEBINARY_DOUBLE
DECIMALDECIMAL(10,0) or DECIMAL(p,s)DECIMAL or DECIMAL(p,s)NUMERICNUMERIC 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)
NUMERICNUMERIC(10,0) or NUMERIC(p,s)NUMERIC or NUMERIC(p,s)NUMERICNUMERIC 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)
CHARCHAR(255) or CHAR(n)CHAR(255) or CHAR(n)TEXTCHAR(255) or CHAR(n)CHAR(255) or CHAR(n)CHAR(255) or CHAR(n)CHAR(255) or CHAR(n)
VARCHARVARCHAR(255) or VARCHAR(n)TEXT or VARCHAR(n)TEXTVARCHAR(255) or VARCHAR(n)VARCHAR(255) or VARCHAR(n/MAX)VARCHAR2(255) or VARCHAR2(n)VARCHAR2(255) or VARCHAR2(n)
NCHARCHAR(255) or CHAR(n)CHAR(255) or CHAR(n)TEXTCHAR(255) or CHAR(n)NVARCHAR(255) or NVARCHAR(n)NCHAR(255) or NCHAR(n)NCHAR(255) or NCHAR(n)
NVARCHARVARCHAR(255) or VARCHAR(n)TEXT or VARCHAR(n)TEXTVARCHAR(255) or VARCHAR(n)NVARCHAR(255) or NVARCHAR(n/MAX)NVARCHAR2(255) or NVARCHAR2(n)NVARCHAR2(255) or NVARCHAR2(n)
TEXTTEXTTEXTTEXTCLOBTEXTCLOBCLOB
MEDIUMTEXTMEDIUMTEXTTEXTTEXTCLOBTEXTCLOBCLOB
LONGTEXTLONGTEXTTEXTTEXTCLOBTEXTCLOBCLOB
CLOBCLOBTEXTTEXTCLOBTEXTCLOBCLOB
NCLOBNCLOBTEXTTEXTCLOBNTEXTNCLOBNCLOB
DATEDATEDATETEXTDATEDATEDATEDATE
TIMETIMETIME(0-6)TEXTTIME or TIME(s)TIME or TIME(s)TIMESTAMP(0)TIMESTAMP(0)
DATETIMEDATETIMETIMESTAMP(0-6)TEXTTIMESTAMP or TIMESTAMP(s)DATETIME or DATETIME2(s)TIMESTAMP(6)TIMESTAMP(6)
TIMESTAMPTIMESTAMPTIMESTAMP(0-6)TEXTTIMESTAMP or TIMESTAMP(s)TIMESTAMPTIMESTAMP(0-9)TIMESTAMP(0-9)
BINARYBINARY(255) or BINARY(n)BYTEABLOBBINARY(255) or BINARY(n)BINARY(255) or BINARY(n)RAW(2000) or RAW(n)RAW(2000) or RAW(n)
VARBINARYVARBINARY(255) or VARBINARY(n)BYTEABLOBVARBINARY(255) or VARBINARY(n)VARBINARY(255) or VARBINARY(n)RAW(2000) or RAW(n)RAW(2000) or RAW(n)
LONGVARBINARYLONGBLOBBYTEABLOBBLOBVARBINARY(MAX)BLOBBLOB
BLOBBLOBBYTEABLOBBLOBVARBINARY(MAX)BLOBBLOB
MEDIUMBLOBMEDIUMBLOBBYTEABLOBBLOBVARBINARY(MAX)BLOBBLOB
LONGBLOBLONGBLOBBYTEABLOBBLOBVARBINARY(MAX)BLOBBLOB
JSONJSONJSONBTEXTJSONJSONJSONJSON
ENUMENUMVARCHAR(255) or VARCHAR(n)TEXTVARCHAR(255) or VARCHAR(n)NVARCHAR(255)VARCHAR2(255)VARCHAR2(255)
SETSETTEXTINTEGERVARCHAR(255) or VARCHAR(n)NVARCHAR(255)VARCHAR2(1000)VARCHAR2(1000)
UUIDCHAR(36)UUIDTEXTUUIDCHAR(36)CHAR(36)CHAR(36)
GEOMETRYGEOMETRYGEOMETRYTEXTGEOMETRYGEOMETRYSDO_GEOMETRYSDO_GEOMETRY
POINTPOINTPOINTTEXTPOINTGEOMETRYSDO_GEOMETRYSDO_GEOMETRY
LINESTRINGLINESTRINGLINESTRINGTEXTLINESTRINGGEOMETRYSDO_GEOMETRYSDO_GEOMETRY
XMLTEXTXMLTEXTXMLXMLXMLTypeXMLType

Automatic Kotlin type inference is covered in 📚Kotlin Type To KColumnType. @ColumnType is the user-facing API for choosing a different enum value.