MariaDB/MySQL Type Support
Foundations JDBC provides comprehensive support for MariaDB and MySQL data types, including unsigned integers, spatial types, and MySQL-specific features.
Integer Types (Signed)
| MariaDB Type | Java Type | Range |
|---|---|---|
TINYINT | Byte | -128 to 127 |
SMALLINT | Short | -32,768 to 32,767 |
MEDIUMINT | Integer | -8,388,608 to 8,388,607 |
INT | Integer | -2,147,483,648 to 2,147,483,647 |
BIGINT | Long | -2^63 to 2^63-1 |
- Kotlin
- Java
- Scala
val tinyType: MariaType<Byte> = MariaTypes.tinyint
val intType: MariaType<Int> = MariaTypes.int_
val bigType: MariaType<Long> = MariaTypes.bigint
MariaType<Byte> tinyType = MariaTypes.tinyint;
MariaType<Integer> intType = MariaTypes.int_;
MariaType<Long> bigType = MariaTypes.bigint;
val tinyType: MariaType[Byte] = MariaTypes.tinyint
val intType: MariaType[Int] = MariaTypes.int_
val bigType: MariaType[Long] = MariaTypes.bigint
Integer Types (Unsigned)
MariaDB supports unsigned integers, which are wrapped in type-safe unsigned types:
| MariaDB Type | Java Type | Range |
|---|---|---|
TINYINT UNSIGNED | Uint1 | 0 to 255 |
SMALLINT UNSIGNED | Uint2 | 0 to 65,535 |
MEDIUMINT UNSIGNED | Uint4 | 0 to 16,777,215 |
INT UNSIGNED | Uint4 | 0 to 4,294,967,295 |
BIGINT UNSIGNED | Uint8 | 0 to 2^64-1 |
- Kotlin
- Java
- Scala
val unsignedTiny: MariaType<Uint1> = MariaTypes.tinyintUnsigned
val unsignedInt: MariaType<Uint4> = MariaTypes.intUnsigned
val unsignedBig: MariaType<Uint8> = MariaTypes.bigintUnsigned
MariaType<Uint1> unsignedTiny = MariaTypes.tinyintUnsigned;
MariaType<Uint4> unsignedInt = MariaTypes.intUnsigned;
MariaType<Uint8> unsignedBig = MariaTypes.bigintUnsigned;
val unsignedTiny: MariaType[Uint1] = MariaTypes.tinyintUnsigned
val unsignedInt: MariaType[Uint4] = MariaTypes.intUnsigned
val unsignedBig: MariaType[Uint8] = MariaTypes.bigintUnsigned
Fixed-Point Types
| MariaDB Type | Java Type | Notes |
|---|---|---|
DECIMAL(p,s) | BigDecimal | Exact numeric |
NUMERIC(p,s) | BigDecimal | Alias for DECIMAL |
- Kotlin
- Java
- Scala
val decimalType: MariaType<BigDecimal> = MariaTypes.decimal
val preciseDecimal: MariaType<BigDecimal> = MariaTypes.decimalOf(10, 2)
MariaType<BigDecimal> decimalType = MariaTypes.decimal;
MariaType<BigDecimal> preciseDecimal = MariaTypes.decimalOf(10, 2);
val decimalType: MariaType[BigDecimal] = MariaTypes.decimal
val preciseDecimal: MariaType[BigDecimal] = MariaTypes.decimalOf(10, 2)
Floating-Point Types
| MariaDB Type | Java Type | Notes |
|---|---|---|
FLOAT | Float | 32-bit IEEE 754 |
DOUBLE | Double | 64-bit IEEE 754 |
- Kotlin
- Java
- Scala
val floatType: MariaType<Float> = MariaTypes.float_
val doubleType: MariaType<Double> = MariaTypes.double_
MariaType<Float> floatType = MariaTypes.float_;
MariaType<Double> doubleType = MariaTypes.double_;
val floatType: MariaType[Float] = MariaTypes.float_
val doubleType: MariaType[Double] = MariaTypes.double_
Boolean Type
| MariaDB Type | Java Type | Notes |
|---|---|---|
BOOLEAN / BOOL | Boolean | Alias for TINYINT(1) |
BIT(1) | Boolean | Single bit as boolean |
- Kotlin
- Java
- Scala
val boolType: MariaType<Boolean> = MariaTypes.bool
val bitBool: MariaType<Boolean> = MariaTypes.bit1
MariaType<Boolean> boolType = MariaTypes.bool;
MariaType<Boolean> bitBool = MariaTypes.bit1;
val boolType: MariaType[Boolean] = MariaTypes.bool
val bitBool: MariaType[Boolean] = MariaTypes.bit1
Bit Types
| MariaDB Type | Java Type | Notes |
|---|---|---|
BIT(n) | byte[] | Bit field (n > 1) |
- Kotlin
- Java
- Scala
val bitType: MariaType<ByteArray> = MariaTypes.bit
MariaType<byte[]> bitType = MariaTypes.bit;
val bitType: MariaType[Array[Byte]] = MariaTypes.bit
String Types
| MariaDB Type | Java Type | Max Length |
|---|---|---|
CHAR(n) | String | 255 chars |
VARCHAR(n) | String | 65,535 bytes |
TINYTEXT | String | 255 bytes |
TEXT | String | 65,535 bytes |
MEDIUMTEXT | String | 16 MB |
LONGTEXT | String | 4 GB |
- Kotlin
- Java
- Scala
val charType: MariaType<String> = MariaTypes.char_Of(10)
val varcharType: MariaType<String> = MariaTypes.varcharOf(255)
val textType: MariaType<String> = MariaTypes.text
val longType: MariaType<String> = MariaTypes.longtext
MariaType<String> charType = MariaTypes.char_Of(10);
MariaType<String> varcharType = MariaTypes.varcharOf(255);
MariaType<String> textType = MariaTypes.text;
MariaType<String> longType = MariaTypes.longtext;
val charType: MariaType[String] = MariaTypes.char_Of(10)
val varcharType: MariaType[String] = MariaTypes.varcharOf(255)
val textType: MariaType[String] = MariaTypes.text
val longType: MariaType[String] = MariaTypes.longtext
Binary Types
| MariaDB Type | Java Type | Max Length |
|---|---|---|
BINARY(n) | byte[] | Fixed n bytes |
VARBINARY(n) | byte[] | Up to n bytes |
TINYBLOB | byte[] | 255 bytes |
BLOB | byte[] | 65,535 bytes |
MEDIUMBLOB | byte[] | 16 MB |
LONGBLOB | byte[] | 4 GB |
- Kotlin
- Java
- Scala
val binaryType: MariaType<ByteArray> = MariaTypes.binaryOf(16)
val varbinaryType: MariaType<ByteArray> = MariaTypes.varbinaryOf(255)
val blobType: MariaType<ByteArray> = MariaTypes.blob
MariaType<byte[]> binaryType = MariaTypes.binaryOf(16);
MariaType<byte[]> varbinaryType = MariaTypes.varbinaryOf(255);
MariaType<byte[]> blobType = MariaTypes.blob;
val binaryType: MariaType[Array[Byte]] = MariaTypes.binaryOf(16)
val varbinaryType: MariaType[Array[Byte]] = MariaTypes.varbinaryOf(255)
val blobType: MariaType[Array[Byte]] = MariaTypes.blob
Date/Time Types
| MariaDB Type | Java Type | Notes |
|---|---|---|
DATE | LocalDate | Naive date, no zone |
TIME | LocalTime | Naive time, no zone |
DATETIME | LocalDateTime | Naive timestamp, no zone |
TIMESTAMP | LocalDateTime | Session-TZ converted — see note below |
YEAR | Year | 4-digit year |
- Kotlin
- Java
- Scala
val dateType: MariaType<LocalDate> = MariaTypes.date
val timeType: MariaType<LocalTime> = MariaTypes.time
val datetimeType: MariaType<LocalDateTime> = MariaTypes.datetime
val yearType: MariaType<Year> = MariaTypes.year
// With fractional seconds precision
val timeFsp: MariaType<LocalTime> = MariaTypes.timeOf(6)
val dtFsp: MariaType<LocalDateTime> = MariaTypes.datetimeOf(3)
MariaType<LocalDate> dateType = MariaTypes.date;
MariaType<LocalTime> timeType = MariaTypes.time;
MariaType<LocalDateTime> datetimeType = MariaTypes.datetime;
MariaType<Year> yearType = MariaTypes.year;
// With fractional seconds precision
MariaType<LocalTime> timeFsp = MariaTypes.timeOf(6);
MariaType<LocalDateTime> dtFsp = MariaTypes.datetimeOf(3);
val dateType: MariaType[LocalDate] = MariaTypes.date
val timeType: MariaType[LocalTime] = MariaTypes.time
val datetimeType: MariaType[LocalDateTime] = MariaTypes.datetime
val yearType: MariaType[Year] = MariaTypes.year
// With fractional seconds precision
val timeFsp: MariaType[LocalTime] = MariaTypes.timeOf(6)
val dtFsp: MariaType[LocalDateTime] = MariaTypes.datetimeOf(3)
None of MariaDB's temporal types store time-zone information in the column itself:
DATE,TIME,DATETIMEare naive — the value you write is the value you read back verbatim, whatever zone the writer was in.TIMESTAMPis stored as UTC seconds internally but is converted to and from the session'stime_zonevariable on every read/write. Two clients with different session timezones see different wall-clock values for the same row — round-trip stability depends ontime_zonebeing set consistently.
All four map to LocalDateTime (or LocalDate/LocalTime) because LocalDateTime is the Java type that matches the naive-wall-clock semantic. Instant, OffsetDateTime, and ZonedDateTime would all misrepresent what the column holds.
For application-level "point in time" values, the idiomatic approach on MariaDB is either: (a) DATETIME with all writes normalized to UTC in application code, or (b) BIGINT epoch milliseconds. Neither matches a single built-in MariaDB type cleanly.
ENUM Type
| MariaDB Type | Java Type |
|---|---|
ENUM('a','b','c') | Java Enum |
- Kotlin
- Java
- Scala
// Define your Kotlin enum
enum class Status { PENDING, ACTIVE, COMPLETED }
// Create MariaType — reified, derives ENUM literal automatically
val statusType: MariaType<Status> = MariaTypes.ofEnum<Status>()
// Define your Java enum
public enum Status {
PENDING,
ACTIVE,
COMPLETED
}
// Create MariaType — derives ENUM('PENDING','ACTIVE','COMPLETED') from values()
MariaType<Status> statusType = MariaTypes.ofEnum(Status.values());
// Plain Scala 3 enum — no extends java.lang.Enum needed
enum Status:
case PENDING, ACTIVE, COMPLETED
// Create MariaType — derives ENUM('PENDING','ACTIVE','COMPLETED') from .values
val statusType: MariaType[Status] =
MariaTypes.ofEnum(Status.values)
values()-based factory derives everythingMariaDB/MySQL enums aren't named types — they're declared inline on the column. The values()-based factory derives the full ENUM('A','B','C') literal automatically:
MariaTypes.ofEnum(State.values()) // Java
MariaTypes.ofEnum<State>() // Kotlin (reified)
MariaTypes.ofEnum(State.values) // Scala 3
The column DDL must match the derived literal — ENUM('PENDING','ACTIVE','COMPLETED') in declaration order, using each constant's name.
Fall back to the string-based overload ofEnum("ENUM('pending',…)", s -> State.valueOf(s.toUpperCase())) when the database labels differ from the Java enum's name() values (e.g. lowercase labels in the DB).
SET Type
| MariaDB Type | Java Type |
|---|---|
SET('a','b','c') | MariaSet |
- Kotlin
- Java
- Scala
val setType: MariaType<MariaSet> = MariaTypes.set
// Create and use sets
val values: MariaSet = MariaSet.of("read", "write")
val csv: String = values.toCommaSeparated()
MariaType<MariaSet> setType = MariaTypes.set;
// Create and use sets
MariaSet values = MariaSet.of("read", "write");
String csv = values.toCommaSeparated();
val setType: MariaType[MariaSet] = MariaTypes.set
// Create and use sets
val values: MariaSet = MariaSet.of("read", "write")
val csv: String = values.toCommaSeparated()
JSON Type
| MariaDB Type | Java Type |
|---|---|
JSON | Json |
- Kotlin
- Java
- Scala
val jsonType: MariaType<Json> = MariaTypes.json
val data: Json = Json("{\"name\": \"John\", \"age\": 30}")
MariaType<Json> jsonType = MariaTypes.json;
Json data = new Json("{\"name\": \"John\", \"age\": 30}");
val jsonType: MariaType[Json] = MariaTypes.json
val data: Json = new Json("{\"name\": \"John\", \"age\": 30}")
Network Types (MariaDB 10.10+)
| MariaDB Type | Java Type | Description |
|---|---|---|
INET4 | Inet4 | IPv4 address |
INET6 | Inet6 | IPv6 address |
- Kotlin
- Java
- Scala
val inet4Type: MariaType<Inet4> = MariaTypes.inet4
val inet6Type: MariaType<Inet6> = MariaTypes.inet6
val ipv4: Inet4 = Inet4.parse("192.168.1.1")
val ipv6: Inet6 = Inet6.parse("::1")
MariaType<Inet4> inet4Type = MariaTypes.inet4;
MariaType<Inet6> inet6Type = MariaTypes.inet6;
Inet4 ipv4 = Inet4.parse("192.168.1.1");
Inet6 ipv6 = Inet6.parse("::1");
val inet4Type: MariaType[Inet4] = MariaTypes.inet4
val inet6Type: MariaType[Inet6] = MariaTypes.inet6
val ipv4: Inet4 = Inet4.parse("192.168.1.1")
val ipv6: Inet6 = Inet6.parse("::1")
UUID Type (MariaDB 10.7+)
| MariaDB Type | Java Type | Description |
|---|---|---|
UUID | java.util.UUID | 128-bit UUID |
- Kotlin
- Java
- Scala
val uuidType: MariaType<UUID> = MariaTypes.uuid
MariaType<UUID> uuidType = MariaTypes.uuid;
val uuidType: MariaType[UUID] = MariaTypes.uuid
VECTOR Type (MariaDB 11.7+)
| MariaDB Type | Java Type | Description |
|---|---|---|
VECTOR(n) | Vector | Fixed-dimension float vector for embeddings |
- Kotlin
- Java
- Scala
val embedding: MariaType<Vector> = MariaTypes.vector(1536)
MariaType<Vector> embedding = MariaTypes.vector(1536);
val embedding: MariaType[Vector] = MariaTypes.vector(1536)
Spatial Types
MariaDB spatial types use the MariaDB Connector/J geometry classes:
| MariaDB Type | Java Type | Description |
|---|---|---|
GEOMETRY | Geometry | Any geometry |
POINT | Point | Single point |
LINESTRING | LineString | Line of points |
POLYGON | Polygon | Closed polygon |
MULTIPOINT | MultiPoint | Multiple points |
MULTILINESTRING | MultiLineString | Multiple lines |
MULTIPOLYGON | MultiPolygon | Multiple polygons |
GEOMETRYCOLLECTION | GeometryCollection | Mixed geometries |
- Kotlin
- Java
- Scala
val pointType: MariaType<Point> = MariaTypes.point
val polygonType: MariaType<Polygon> = MariaTypes.polygon
val gcType: MariaType<GeometryCollection> = MariaTypes.geometrycollection
// Create a point
val p: Point = Point(1.0, 2.0)
MariaType<Point> pointType = MariaTypes.point;
MariaType<Polygon> polygonType = MariaTypes.polygon;
MariaType<GeometryCollection> gcType = MariaTypes.geometrycollection;
// Create a point
Point p = new Point(1.0, 2.0);
val pointType: MariaType[Point] = MariaTypes.point
val polygonType: MariaType[Polygon] = MariaTypes.polygon
val gcType: MariaType[GeometryCollection] = MariaTypes.geometrycollection
// Create a point
val p: Point = new Point(1.0, 2.0)
Nullable Types
Any type can be made nullable using .opt():
- Kotlin
- Java
- Scala
val notNull: MariaType<Int> = MariaTypes.int_
val nullable: MariaType<Int?> = MariaTypes.int_.opt()
MariaType<Integer> notNull = MariaTypes.int_;
MariaType<Optional<Integer>> nullable = MariaTypes.int_.opt();
val notNull: MariaType[Int] = MariaTypes.int_
val nullable: MariaType[Option[Int]] = MariaTypes.int_.opt
Custom Domain Types
Wrap base types with custom Java types using transform:
- Kotlin
- Java
- Scala
// Wrapper type
data class UserId(val value: Long)
// Create MariaType from bigint
val userIdType: MariaType<UserId> = MariaTypes.bigint.transform(::UserId, UserId::value)
// Wrapper type
public record UserId(Long value) {}
// Create MariaType from bigint
MariaType<UserId> userIdType = MariaTypes.bigint.transform(UserId::new, UserId::value);
// Wrapper type
case class UserId(value: Long)
// Create MariaType from bigint
val userIdType: MariaType[UserId] = MariaTypes.bigint.transform(UserId.apply, _.value)