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

# SQLite to Oracle data types

Each row is a type from SQLite that Oracle stores differently: what the Oracle 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 Oracle](/sqlite-to-oracle) opens the converter set up for this pair. The [SQLite to Oracle migration guide](/docs/migrations/sqlite-to-oracle) 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 Oracle | 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 Oracle | Why | Report line |
| --- | --- | --- | --- |
| BOOLEAN, BOOL | NUMBER(1) with a CHECK of 0 and 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 Oracle | Why | Report line |
| --- | --- | --- | --- |
| TEXT, VARCHAR(n), CHAR(n), CLOB | VARCHAR2(n CHAR) when every value fits, else CLOB | SQLite never enforces a length; a declared length holds only when every value fits it. | None |
| TEXT and VARCHAR(n) longer than 4000 bytes | VARCHAR2(4000 CHAR) when every value fits 4000 bytes (750 characters in a key), else CLOB | A VARCHAR2 holds 4000 bytes by default and Oracle can't index a CLOB, so text keeps VARCHAR2 when its values fit and is a CLOB when they don't. | `text_as_lob` (fix) |
| empty strings and empty blobs | NULL | Oracle stores an empty string as NULL, so a value that was ' reads back as NULL. The report counts them per column. | `empty_string_null` (problem) |
| 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 Oracle | Why | Report line |
| --- | --- | --- | --- |
| DATE, DATETIME, TIMESTAMP holding ISO 8601 text | DATE or TIMESTAMP(p), by what the values hold | 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 Oracle | Why | Report line |
| --- | --- | --- | --- |
| BLOB, and columns holding bytes | BLOB | Bytes stay bytes; text and numbers in the same column are kept as their bytes. | None |

## JSON, spatial and other types

| In SQLite | In Oracle | 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 | CLOB | When every value is a JSON object or array. | None |
| Infinity in REAL columns | kept as BINARY_DOUBLE_INFINITY | Oracle's doubles hold infinity. | None |

## Counters and identities

| In SQLite | In Oracle | Why | Report line |
| --- | --- | --- | --- |
| INTEGER PRIMARY KEY, AUTOINCREMENT | GENERATED BY DEFAULT ON NULL AS IDENTITY, 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), [MariaDB](/docs/types/sqlite-to-mariadb), [SQLite](/docs/types/sqlite-to-sqlite), [SQL Server](/docs/types/sqlite-to-sql-server)
- Into Oracle from [MySQL](/docs/types/mysql-to-oracle), [MariaDB](/docs/types/mariadb-to-oracle), [PostgreSQL](/docs/types/postgresql-to-oracle), [SQL Server](/docs/types/sql-server-to-oracle), [Oracle](/docs/types/oracle-to-oracle)
- [Every pair](/docs/types#from-one-database-to-another)
