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

# Oracle to MariaDB data types

Each row is a type from Oracle 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:** [Oracle to MariaDB](/oracle-to-mariadb) opens the converter set up for this pair. The [Oracle to MariaDB migration guide](/docs/migrations/oracle-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 Oracle | In MariaDB | Why | Report line |
| --- | --- | --- | --- |
| NUMBER, NUMBER(p,s), FLOAT(b) | decimal(p,s), or bigint | 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. | None |

## Booleans and bits

| In Oracle | In MariaDB | Why | Report line |
| --- | --- | --- | --- |
| BOOLEAN (23ai) | tinyint(1) | MariaDB has no boolean column, so TRUE and FALSE are 1 and 0. | None |

## Text

| In Oracle | In MariaDB | Why | Report line |
| --- | --- | --- | --- |
| VARCHAR2(n BYTE\|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG | varchar(n) up to 1024 characters, text types beyond | Lengths count characters, whether Oracle counted bytes or characters, so every value fits. | None |
| NUL characters in text | kept | The value is copied with the NUL character escaped. | 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 MariaDB | Why | Report line |
| --- | --- | --- | --- |
| INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND | varchar(100) with Oracle's text, such as +01-06 | MariaDB's TIME holds durations up to 838 hours, and has no years or months; the text keeps every part. | `type_replaced` (fix) |
| DATE, TIMESTAMP(p) | datetime(p) | 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(7) to TIMESTAMP(9) | six digits of a second, the seventh cut | MariaDB keeps microseconds; the seventh digit (100 nanoseconds) is cut, never rounded, so no value moves to the next second or day. | `fraction_cut` (fix) |
| TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE | datetime(p) in UTC | MariaDB's TIMESTAMP only reaches 2038, so moments are stored as datetime in UTC, the same instant whatever offset each value had. | `moments_as_utc` (fix) |
| dates before year 1 and time zones given as region names | NULL | MariaDB stores years 1000 to 9999, and Oracle goes back to the year 1. Those values become NULL and the report counts them. | `date_out_of_range` (problem) |

## Binary

| In Oracle | In MariaDB | Why | Report line |
| --- | --- | --- | --- |
| BLOB, RAW(n), LONG RAW | binary(n), varbinary(n) and blob types | Bytes stay bytes. | None |

## JSON, spatial and other types

| In Oracle | In MariaDB | Why | Report line |
| --- | --- | --- | --- |
| JSON (21c), and CLOB holding JSON | json | 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 | longtext | Text holds any value; change the type after loading. | `unknown_type` (problem) |
| NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE | NULL | MariaDB's floating-point types have no NaN or infinity, so those values become NULL and the report counts them. | `invalid_value_null` (problem) |

## Counters and identities

| In Oracle | In MariaDB | Why | Report line |
| --- | --- | --- | --- |
| identity columns, and a sequence a BEFORE INSERT trigger assigns | AUTO_INCREMENT, 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 | a plain integer | MariaDB counts one column per table, at the start of a key; any other keeps its values without a counter. | `counter_dropped` (problem) |

## Other pairs

- Oracle into [PostgreSQL](/docs/types/oracle-to-postgresql), [MySQL](/docs/types/oracle-to-mysql), [SQLite](/docs/types/oracle-to-sqlite), [SQL Server](/docs/types/oracle-to-sql-server), [Oracle](/docs/types/oracle-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), [SQLite](/docs/types/sqlite-to-mariadb)
- [Every pair](/docs/types#from-one-database-to-another)
