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

# Oracle to SQLite data types

Each row is a type from Oracle that SQLite stores differently: what the SQLite 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:** [Oracle to SQLite](/oracle-to-sqlite) opens the converter set up for this pair. The [Oracle to SQLite migration guide](/docs/migrations/oracle-to-sqlite) 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 Oracle | In SQLite | Why | Report line |
| --- | --- | --- | --- |
| NUMBER, NUMBER(p,s), FLOAT(b) | INTEGER, or NUMERIC kept exact as text past 15 digits | NUMBER keeps every digit; a NUMBER without precision whose values are all whole numbers of up to 18 digits is a 64-bit integer, and a negative scale holds as many digits before the point. | `decimal_as_text` (fix) |

## Booleans and bits

| In Oracle | In SQLite | Why | Report line |
| --- | --- | --- | --- |
| BOOLEAN (23ai) | INTEGER 0 or 1 with a CHECK | SQLite has no boolean column, so TRUE and FALSE are 1 and 0. | None |

## Text

| In Oracle | In SQLite | Why | Report line |
| --- | --- | --- | --- |
| VARCHAR2(n BYTE\|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG | TEXT | Lengths count characters, whether Oracle counted bytes or characters, so every value fits. | None |
| NUL characters in text | kept | SQLite text can hold a NUL character, so the value is copied as it is. | None |
| text that isn't valid in its encoding | the bad bytes as the replacement character | The script is UTF-8 and every value has to be valid text. | `invalid_utf8_replaced` (problem) |

## Dates and times

| In Oracle | In SQLite | Why | Report line |
| --- | --- | --- | --- |
| INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND | TEXT with Oracle's text, such as +01-06 | SQLite has no interval type; the text keeps every part. | `type_replaced` (fix) |
| DATE, TIMESTAMP(p) | DATETIME as ISO 8601 text, every digit kept | Oracle's DATE holds a time to the second, so it is a date and time. An export in an American or German session writes dates without their time or century (DD-MON-RR); export in an ISO session (SYYYY-MM-DD HH24:MI:SS) to keep them. | None |
| TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE | TIMESTAMP as ISO 8601 text in UTC | SQLite has no type that keeps an offset, so each moment is written in UTC: the same instant whatever offset it had. | `moments_as_utc` (fix) |
| dates before year 1 and time zones given as region names | NULL | A value that isn't a date becomes NULL and the report counts it. | `date_out_of_range` (problem) |

## Binary

| In Oracle | In SQLite | Why | Report line |
| --- | --- | --- | --- |
| BLOB, RAW(n), LONG RAW | BLOB | Bytes stay bytes. | None |

## JSON, spatial and other types

| In Oracle | In SQLite | Why | Report line |
| --- | --- | --- | --- |
| JSON (21c), and CLOB holding JSON | TEXT | The same JSON values; a SQL NULL the export wrote as 'null' stays NULL. | None |
| ROWID, UROWID, XMLTYPE, SDO_GEOMETRY | TEXT | Oracle's own types have no equivalent; their values keep their text, ROWID values included, though they mean nothing off Oracle. | `type_replaced` (fix) |
| types IntoSQL doesn't know, and object types | TEXT | Text holds any value; change the type after loading. | `unknown_type` (problem) |
| NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE | Infinity as 9e999; NaN as NULL | SQLite reads 9e999 back as infinity and has no NaN. | None |

## Counters and identities

| In Oracle | In SQLite | Why | Report line |
| --- | --- | --- | --- |
| identity columns, and a sequence a BEFORE INSERT trigger assigns | INTEGER PRIMARY KEY AUTOINCREMENT, continuing after the highest id | The copied ids load as they are, and the counter continues after the highest one. A column a trigger fills from a sequence (the way before 12c) is an identity too. | None |
| identity columns the target can't count | INTEGER without a counter | SQLite only counts a column that is the whole primary key, so the column keeps its values and new rows need theirs. | `counter_dropped` (problem) |

## Other pairs

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