Data Types
Turso uses the same dynamic type system as SQLite, where values have types but columns do not enforce a single type (unless using STRICT tables). Every value stored in Turso belongs to one of five storage classes.Storage Classes
| Storage Class | Description |
|---|---|
| NULL | The NULL value |
| INTEGER | A signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes depending on magnitude |
| REAL | An 8-byte IEEE 754 floating-point number |
| TEXT | A UTF-8 encoded string |
| BLOB | Raw binary data, stored exactly as input |
Type Affinity
When a column is declared with a type name, Turso assigns a type affinity to that column. Type affinity is a recommendation for how to store values, not a strict constraint (unless using STRICT tables). Turso uses the same affinity rules as SQLite.Affinity Determination Rules
The type affinity of a column is determined by the declared type name, using these rules applied in order:| Rule | Condition | Affinity | Examples |
|---|---|---|---|
| 1 | Type name contains “INT” | INTEGER | INT, INTEGER, BIGINT, SMALLINT, TINYINT |
| 2 | Type name contains “CHAR”, “CLOB”, or “TEXT” | TEXT | TEXT, VARCHAR(255), CLOB, CHARACTER(20) |
| 3 | Type name contains “BLOB” or no type specified | BLOB | BLOB, (no type) |
| 4 | Type name contains “REAL”, “FLOA”, or “DOUB” | REAL | REAL, FLOAT, DOUBLE, DOUBLE PRECISION |
| 5 | Otherwise | NUMERIC | NUMERIC, DECIMAL, BOOLEAN, DATE |
Type Conversions
When a value is inserted into a column, Turso attempts to convert the value to the column’s affinity:- INTEGER affinity: If the value is TEXT or REAL that looks like an integer, Turso converts the value to INTEGER
- REAL affinity: If the value is TEXT that looks like a number, Turso converts to REAL. If the value is an integer, Turso converts to REAL
- NUMERIC affinity: Turso tries INTEGER first, then REAL, then keeps as TEXT
- TEXT affinity: Integer and REAL values are converted to their text representation
- BLOB affinity: No conversion is attempted
STRICT Tables
STRICT tables enforce type checking at the storage layer. Every value inserted into a STRICT table must match the declared column type or be convertible to the column type.Allowed Types in STRICT Tables
STRICT tables only allow these base type names:| Type | Description |
|---|---|
| INTEGER | Signed integer |
| REAL | Floating-point number |
| TEXT | UTF-8 string |
| BLOB | Raw binary data |
| ANY | Any storage class (disables type checking for this column) |
Turso Extension: STRICT tables also accept custom type names. Custom types extend the type system with user-defined encoding, decoding, validation, and operator overloading.
Custom Types
Turso Extension: Custom types are a Turso-specific feature not available in SQLite. Custom types work only with STRICT tables. This feature is experimental and must be enabled before use.
CREATE TYPE statement.
Built-in Custom Types
Turso provides several built-in custom types available in STRICT tables:| Type | Base | Description |
|---|---|---|
date | TEXT | ISO 8601 date (YYYY-MM-DD) |
time | TEXT | ISO 8601 time (HH:MM:SS) |
timestamp | TEXT | ISO 8601 datetime |
varchar(N) | TEXT | Text with maximum length constraint |
numeric(P,S) | BLOB | Fixed-point decimal with precision and scale |
smallint | INTEGER | Integer constrained to -32768..32767 |
boolean | INTEGER | Integer constrained to 0 or 1 |
uuid | BLOB | UUID stored as 16-byte blob, displayed as string |
bytea | BLOB | Binary data (PostgreSQL-compatible alias) |
inet | TEXT | IP address |
json | TEXT | Validated JSON text |
jsonb | BLOB | JSON in binary format |
Inspecting Types
List all available types (built-in and custom):sqlite_turso_types virtual table:
Comparison and Sorting
Turso uses the same comparison rules as SQLite. Values of different storage classes are ordered as:- NULL values are considered less than any other value
- INTEGER and REAL values are compared numerically
- TEXT values are compared using the column’s collation sequence (default: BINARY)
- BLOB values are compared using
memcmp()
See Also
- CREATE TABLE for column definitions and constraints
- CREATE TYPE for custom type definitions
- Expressions for CAST expressions and type conversions
- Compatibility for differences from SQLite