---
title: "SQLite to MariaDB data types"
description: "Every SQLite data type that MariaDB stores differently, what the converter writes for it, when, and the report line."
canonical: https://intosql.com/docs/types/sqlite-to-mariadb
last_updated: 2026-10-15
---

# SQLite to MariaDB data types

Each row is a type from SQLite that MariaDB stores differently: what the MariaDB script gets, why, and the line the report writes about it. The rows come from the converter's own rules, so this page matches what it does.

**Convert in the browser:** [SQLite to MariaDB](/sqlite-to-mariadb) opens the converter set up for this pair. The [SQLite to MariaDB migration guide](/docs/migrations/sqlite-to-mariadb) covers dumping, loading and the rules for keys, indexes and names.

A report line is a fix when the converter changed something and lists it, or a problem when a value or object is worth a look.

## Numbers

| In SQLite | In MariaDB | Why | Report line |
| --- | --- | --- | --- |
| DECIMAL(p,s), NUMERIC | the exact type when every value fits it, else a double | SQLite stores these as integers or doubles; a declared precision holds only when the values fit it. | None |

## Booleans and bits

| In SQLite | In MariaDB | Why | Report line |
| --- | --- | --- | --- |
| BOOLEAN, BOOL | tinyint(1) | When every value is 0 or 1; a column that also holds other values keeps them as numbers or text. | None |

## Text

| In SQLite | In MariaDB | Why | Report line |
| --- | --- | --- | --- |
| TEXT, VARCHAR(n), CHAR(n), CLOB | varchar(n) up to 1024 characters, text types beyond | SQLite never enforces a length; a declared length holds only when every value fits it. | None |
| NUL characters in text | kept | The sqlite3 shell and Python cut text at a NUL character when they dump it, so only what precedes it is in the dump. | None |
| text that isn't valid UTF-8 | the bad bytes as the replacement character | Dumps write such text as raw bytes; the script is UTF-8. | `invalid_utf8_replaced` (problem) |

## Dates and times

| In SQLite | In MariaDB | Why | Report line |
| --- | --- | --- | --- |
| DATE, DATETIME, TIMESTAMP holding ISO 8601 text | date, datetime(p) | When every value is a date or a date and time; epoch numbers and other text keep their values as they are. | None |

## Binary

| In SQLite | In MariaDB | Why | Report line |
| --- | --- | --- | --- |
| BLOB, and columns holding bytes | blob types | Bytes stay bytes; text and numbers in the same column are kept as their bytes. | None |

## JSON, spatial and other types

| In SQLite | In MariaDB | Why | Report line |
| --- | --- | --- | --- |
| declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none) | the type every value in the column fits | SQLite keeps any value in any column, so the declared type is a hint: each column gets the type all of its values fit, and a column holding mixed values keeps their text. | None |
| JSON holding JSON text | json | When every value is a JSON object or array. | None |
| Infinity in REAL columns | NULL | MariaDB's doubles have no infinity, so those values become NULL and the report counts them. | `invalid_value_null` (problem) |

## Counters and identities

| In SQLite | In MariaDB | Why | Report line |
| --- | --- | --- | --- |
| INTEGER PRIMARY KEY, AUTOINCREMENT | AUTO_INCREMENT, continuing after the highest id or sqlite_sequence's | Only a column declared exactly INTEGER PRIMARY KEY is the rowid; every row keeps its id, and the counter starts after the highest id ever handed out. | None |

## Other pairs

- SQLite into [PostgreSQL](/docs/types/sqlite-to-postgresql), [MySQL](/docs/types/sqlite-to-mysql), [SQLite](/docs/types/sqlite-to-sqlite), [SQL Server](/docs/types/sqlite-to-sql-server), [Oracle](/docs/types/sqlite-to-oracle)
- Into MariaDB from [MySQL](/docs/types/mysql-to-mariadb), [MariaDB](/docs/types/mariadb-to-mariadb), [PostgreSQL](/docs/types/postgresql-to-mariadb), [SQL Server](/docs/types/sql-server-to-mariadb), [Oracle](/docs/types/oracle-to-mariadb)
- [Every pair](/docs/types#from-one-database-to-another)
