---
title: "Migrate Oracle to MariaDB in your browser"
description: "Migrate an Oracle database to MariaDB: convert a SQL Developer or SQLcl export into a script with the same tables, keys and data, and a report of every change."
canonical: https://intosql.com/oracle-to-mariadb
last_updated: 2026-10-15
---

# Migrate Oracle to MariaDB in your browser

Drop the .sql file SQL Developer's Database Export or SQLcl writes, with its tables and Insert statements, and download a script for MariaDB with the same tables, keys, indexes and data. Every value MariaDB can't hold as it is, and every object it doesn't carry, is listed in the report.

[Oracle to MariaDB migration guide](https://intosql.com/docs/migrations/oracle-to-mariadb)

[Oracle to MariaDB data types](https://intosql.com/docs/types/oracle-to-mariadb)

## What changes from Oracle to MariaDB

Each row is a rule the converter applies, with the report line it writes when the rule changes something in your data.

| In Oracle | In MariaDB | Report line |
| --- | --- | --- |
| BOOLEAN (23ai) | tinyint(1) |  |
| VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG | varchar(n) up to 1024 characters, text types beyond |  |
| NUMBER, NUMBER(p,s), FLOAT(b) | decimal(p,s), or bigint |  |
| INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND | varchar(100) with Oracle's text, such as +01-06 | `type_replaced` |
| DATE, TIMESTAMP(p) | datetime(p) |  |
| TIMESTAMP(7) to TIMESTAMP(9) | six digits of a second, the seventh cut | `fraction_cut` |
| TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE | datetime(p) in UTC | `moments_as_utc` |
| JSON (21c), and CLOB holding JSON | json |  |
| BLOB, RAW(n), LONG RAW | binary(n), varbinary(n) and blob types |  |
| ROWID, UROWID, XMLTYPE, SDO_GEOMETRY | text | `type_replaced` |
| collations that ignore case (BINARY_CI) | exact comparison (utf8mb4_bin) | `case_insensitive_collation` |
| identity columns, and a sequence a BEFORE INSERT trigger assigns | AUTO_INCREMENT, continuing after the highest id |  |
| identity columns the target can't count | a plain integer | `counter_dropped` |
| CREATE SEQUENCE | CREATE SEQUENCE with the same options |  |
| virtual columns (GENERATED ALWAYS AS ... VIRTUAL) | generated columns, STORED when PERSISTED, VIRTUAL otherwise |  |
| virtual columns with functions IntoSQL doesn't write, and the || operator | a plain column | `generated_not_translated` |
| defaults with functions IntoSQL doesn't write (SYS_GUID(), ||) | no default | `default_not_translated` |
| CHECK constraints | translated |  |
| CHECK constraints with functions IntoSQL doesn't write | not created | `check_skipped` |
| CHECK constraints that are DISABLE or ENABLE NOVALIDATE | not created | `check_not_enforced` |
| function-based, bitmap and domain indexes | not created | `index_skipped` |
| foreign keys | foreign keys, loaded with FOREIGN_KEY_CHECKS=0 |  |
| foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE ones | not created | `foreign_key_skipped` |
| partitioned tables | one table with every partition's rows | `partitions_dropped` |
| several schemas in one export | one database, tables named after their schema first | `schemas_merged` |
| NOT NULL columns with values that become NULL | NOT NULL dropped | `not_null_relaxed` |
| views, synonyms, types, packages, procedures, functions and other triggers | listed in the report | `not_converted_objects` |
| exports without CREATE TABLE (data only) | types read from the values | `no_schema` |
| expressions in INSERT values other than the ones exports write | NULL | `expression_value` |
| types IntoSQL doesn't know, and object types | longtext | `unknown_type` |
| dates before year 1 and time zones given as region names | NULL | `date_out_of_range` |
| NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE | NULL | `invalid_value_null` |
| NUL characters in text | kept |  |
| text that isn't valid in its encoding | the bad bytes as the replacement character | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | copied as it is | `mojibake_suspected` |

## Load the script into MariaDB

The script creates the tables, copies the rows, then adds keys, indexes and foreign keys, so it loads fast and stops at the first error.

```shell
mariadb --default-character-set=utf8mb4 mydb < oracle.mariadb.sql
```

Foreign keys are created as the dump declares them, with FOREIGN_KEY_CHECKS=0 while the rows load, as mysqldump does.

For a large dump, run the client on the same machine as the server, and raise max_allowed_packet if a single row is very large.

IntoSQL Pro loads the file straight into MariaDB from the desktop app or the command line, without writing a script.

## Dump Oracle for the best result

The converter reads what the dump holds. These options keep more of your data in it:

- In SQL Developer, choose Tools, Database Export, with DDL and the Insert data format. SQLcl writes the same with SET SQLFORMAT INSERT.
- Run ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' before exporting: the default format writes dates without their time or century.
- A .dmp file from exp or expdp is binary: import it into an Oracle database, Oracle Database Free in Docker for one, and export it with SQL Developer.

## What isn't converted

Views, packages, procedures, functions, triggers, types and synonyms are written in PL/SQL. They are listed in the report by name, never dropped silently, so you can rewrite them for MariaDB.

## Questions about Oracle to MariaDB

### Is my dump uploaded?

No. The converter runs in your browser and reads the dump from your disk in pieces, so it never leaves your computer. The desktop app and the command line convert on your computer too.

### How large can the dump be?

The converter never holds the whole dump in memory: it reads the file twice, by ranges, and writes the script as it goes. Multi-gigabyte dumps convert in the browser, in the desktop app and with the command line.

### Can I convert a .dmp file from exp or expdp?

Not directly: Data Pump and the original Export write a binary format only Oracle reads. Import it into any Oracle database, Oracle Database Free runs in Docker, and export it with SQL Developer's Database Export or SQLcl. The converter says so when it gets a .dmp file.

### Which Oracle versions can the export come from?

Exports from SQL Developer and SQLcl, with DBMS_METADATA's table definitions, from Oracle 11g on. Every test export comes from Oracle 21c and 23ai, in American, German and ISO sessions, and is compared with its source cell by cell.

### What happens to NUMBER, DATE and the other Oracle types?

NUMBER becomes decimal, or bigint for whole numbers, and text past 65 digits; DATE becomes datetime, keeping its time; CLOB longtext, BLOB blob, and intervals keep Oracle's text. NaN and Infinity become NULL and the report counts them.

### Are identity columns and sequences kept?

Yes. Identity columns become AUTO_INCREMENT and continue after the highest id; sequences become MariaDB sequences, and defaults that draw from one keep drawing from it.

### What about PL/SQL packages, procedures and triggers?

They are listed in the report by name and not converted, because each database writes them in its own language.

### Which MariaDB versions does the script load on?

MariaDB 10.11 and later. Every test export loads on 10.11 and 11.4, stopping at the first error if anything goes wrong.

## From Oracle

- [Oracle to PostgreSQL](https://intosql.com/oracle-to-postgresql)
- [Oracle to MySQL](https://intosql.com/oracle-to-mysql)
- [Oracle to SQLite](https://intosql.com/oracle-to-sqlite)
- [Oracle to SQL Server](https://intosql.com/oracle-to-sql-server)
- [Oracle to Oracle](https://intosql.com/oracle-to-oracle)

## Into MariaDB

- [MySQL to MariaDB](https://intosql.com/mysql-to-mariadb)
- [MariaDB to MariaDB](https://intosql.com/mariadb-to-mariadb)
- [PostgreSQL to MariaDB](https://intosql.com/postgresql-to-mariadb)
- [SQL Server to MariaDB](https://intosql.com/sql-server-to-mariadb)
- [SQLite to MariaDB](https://intosql.com/sqlite-to-mariadb)

## Guide and every pair

- [MariaDB to Oracle](https://intosql.com/mariadb-to-oracle)
- [Oracle to MariaDB migration guide](https://intosql.com/docs/migrations/oracle-to-mariadb)
- [Oracle to MariaDB data types](https://intosql.com/docs/types/oracle-to-mariadb)
- [Every database pair](https://intosql.com/database-migration)
