---
title: "Migrare MySQL a Oracle nel browser"
description: "Migra un database MySQL o MariaDB a Oracle: converti il suo dump in uno script con le stesse tabelle, chiavi e dati, e un report di ogni modifica."
canonical: https://intosql.com/it/mysql-in-oracle
last_updated: 2026-10-15
---

# Migrare MySQL a Oracle nel browser

Trascina un dump di mysqldump, mariadb-dump, mysqlpump, phpMyAdmin o Adminer, in .sql o .sql.gz, e scarica uno script Oracle con le stesse tabelle, chiavi, indici e dati. Ogni valore che Oracle non può contenere così com'è, e ogni oggetto che non supporta, è elencato nel report.

[Guida alla migrazione da MySQL a Oracle](https://intosql.com/docs/migrations/mysql-to-oracle)

[Tipi di dati da MySQL a Oracle](https://intosql.com/docs/types/mysql-to-oracle)

## Cosa cambia da MySQL a Oracle

Ogni riga è una regola che il convertitore applica, con la riga del report che scrive quando la regola cambia qualcosa nei tuoi dati.

| In MySQL | In Oracle | Riga del report |
| --- | --- | --- |
| TINYINT(1), BOOL | NUMBER(1) con un CHECK di 0 e 1 quando ogni valore è 0 o 1, altrimenti NUMBER(3) | `bool_kept_numeric` |
| UNSIGNED integers | NUMBER abbastanza ampio per l'intervallo, con un CHECK che non sia negativo |  |
| ZEROFILL and display widths | rimosso | `zerofill_dropped` |
| FLOAT(M,D) | BINARY_FLOAT o BINARY_DOUBLE, senza la scala | `float_scale_dropped` |
| DECIMAL(p,s) | NUMBER(p,s) fino a 38 cifre; VARCHAR2 oltre | `decimal_as_text` |
| BIT(1), BIT(n) | NUMBER(1), NUMBER(19) fino a 63 bit, NUMBER(20) per BIT(64) |  |
| zero, partial or impossible dates (0000-00-00, 2024-02-30) | NULL | `invalid_date_null` |
| NOT NULL columns with values that become NULL | NOT NULL rimosso | `not_null_relaxed` |
| empty strings and empty binary values | NULL | `empty_string_null` |
| DEFAULT '0000-00-00' | nessun valore predefinito | `zero_date_default` |
| TIME | INTERVAL DAY TO SECOND, che contiene durate |  |
| YEAR | NUMBER(4) con un CHECK del suo intervallo |  |
| CHAR(n), VARCHAR(n) | VARCHAR2(n CHAR), contando i caratteri |  |
| VARCHAR(n) and TEXT longer than 4000 bytes | CLOB | `text_as_lob` |
| DATETIME | TIMESTAMP |  |
| TIMESTAMP | TIMESTAMP WITH TIME ZONE nel fuso indicato dal dump, UTC se non ne indica uno | `timestamp_zone_assumed` |
| ENUM | VARCHAR2 con un CHECK dei suoi valori |  |
| ENUM holding '' (MySQL's error value) | NULL |  |
| ENUM holding values outside its list | nessun CHECK | `enum_check_skipped` |
| SET | VARCHAR2 come lo scrive MySQL ('a,b') |  |
| JSON | CLOB |  |
| NUL bytes in text | mantenuto |  |
| text that isn't valid in its character set | i byte errati come carattere di sostituzione | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | copiato così com'è | `mojibake_suspected` |
| AUTO_INCREMENT | GENERATED BY DEFAULT ON NULL AS IDENTITY, riavviato oltre gli id copiati |  |
| MyISAM AUTO_INCREMENT on the second column of a key | un solo contatore per la tabella | `myisam_group_autoincrement` |
| ON UPDATE CURRENT_TIMESTAMP | un trigger BEFORE UPDATE | `on_update_trigger` |
| generated columns | colonne virtuali | `stored_as_virtual` |
| generated columns with functions Oracle lacks | una colonna semplice | `generated_not_translated` |
| INVISIBLE columns | colonne INVISIBLE |  |
| CHECK constraints | tradotti, dentro CREATE TABLE |  |
| CHECK constraints with functions Oracle lacks | non creato | `check_skipped` |
| CHECK ... NOT ENFORCED | non creati | `check_not_enforced` |
| defaults with functions Oracle lacks | nessun valore predefinito | `default_not_translated` |
| keys and indexes on a prefix, c(20) | un indice su SUBSTR della colonna | `prefix_unique` |
| FULLTEXT indexes | non creato | `fulltext_not_created` |
| SPATIAL indexes | non creato | `spatial_index_not_created` |
| functional indexes, and indexes on whole CLOB or BLOB columns | non creato | `index_skipped` |
| foreign keys | dopo i dati ENABLE NOVALIDATE, poi validata con un avviso sulle righe orfane |  |
| ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT | rimosso | `foreign_key_action_unsupported` |
| foreign keys to columns without a unique key | non creata | `foreign_key_skipped` |
| table and column names | maiuscolo per i nomi semplici, altrimenti come scritti | `identifier_renamed` |
| names over 128 bytes | accorciato | `name_shortened` |
| GEOMETRY, POINT, POLYGON... | BLOB con WKB | `geometry_as_blob` |
| INET4, INET6, UUID (MariaDB) | VARCHAR2(39), VARCHAR2(36) |  |
| BINARY, VARBINARY, BLOB | RAW fino a 2000 byte, altrimenti BLOB |  |
| PARTITION BY | una sola tabella | `partitions_dropped` |
| WITH SYSTEM VERSIONING (MariaDB) | una tabella con le righe attuali | `system_versioning_dropped` |
| MyISAM, MEMORY and other engines | una tabella normale | `engine_dropped` |
| views, triggers, procedures, functions and events | elencati nel report | `not_converted_objects` |
| dumps without CREATE TABLE | tipi ricavati dai valori | `no_schema` |
| geometries in a dump without CREATE TABLE | BLOB con WKB | `geometry_inferred` |
| _ci collations | confronto esatto | `case_insensitive_collation` |
| SET NAMES utf8 from utf8mb4 tables | convertito, con un avviso | `dump_lost_four_byte_chars` |
| dumps without SET NAMES whose text isn't UTF-8 | letto come Latin-1 (Windows-1252) | `charset_guessed` |
| sjis, cp932, gbk, big5 dumps | letto come UTF-8, con un avviso | `unsupported_charset` |
| UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows | valutate |  |
| other expressions in rows | NULL | `expression_value` |
| DEFAULT in VALUES | il valore predefinito della colonna | `default_keyword_filled` |
| DEFAULT in VALUES without a literal default | NULL | `default_keyword_null` |
| REPLACE and INSERT IGNORE | righe semplici | `replace_as_insert` |
| types IntoSQL doesn't know | CLOB | `unknown_type` |
| values that don't fit their column | NULL | `invalid_value_null` |
| unreadable geometries | NULL | `bad_geometry` |
| dumps of several databases | un unico schema, ogni tabella con il nome del suo database davanti | `databases_merged` |
| CREATE SEQUENCE (MariaDB) | CREATE SEQUENCE, al valore raggiunto |  |
| VECTOR(n) (MariaDB 11.7+) | CLOB con i float come array JSON | `type_replaced` |

## Carica lo script in Oracle

Lo script crea le tabelle, copia le righe, poi aggiunge chiavi, indici e chiavi esterne, così si carica in fretta e si ferma al primo errore.

```shell
NLS_LANG=.AL32UTF8 sqlplus -S -L user@//localhost/mydb @mysql.oracle.sql
```

Le chiavi esterne vengono aggiunte ENABLE NOVALIDATE, così le nuove righe sono controllate subito, e poi validate. Se una riga vecchia punta a una riga che non esiste, lo script dice quale vincolo e lo lascia non validato, invece di fallire a metà.

Per un dump grande, esegui SQL*Plus sulla stessa macchina del database. Lo script fa il commit ogni 100 righe. L'utente che lo esegue ha bisogno di CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER e CREATE PROCEDURE, e di una quota sul suo tablespace.

## Fai il dump di MySQL per il miglior risultato

Il convertitore legge ciò che il dump contiene. Con queste opzioni il dump conserva più dei tuoi dati:

- --default-character-set=utf8mb4 conserva emoji e altri caratteri a 4 byte, che un dump utf8 perde prima che il convertitore lo veda.
- --hex-blob scrive le colonne binarie in esadecimale, che resiste alla copia tra sistemi diversi.
- --routines --triggers --events aggiungono quegli oggetti al dump, così il report può elencarli.

## Cosa non viene convertito

Viste, trigger, stored procedure, funzioni ed eventi sono scritti nel linguaggio proprio di ogni database. Sono elencati per nome nel report, mai rimossi in silenzio, così puoi riscriverli per Oracle.

## Domande sulla conversione da MySQL a Oracle

### Il mio dump viene caricato?

No. Il convertitore funziona nel tuo browser e legge il dump dal tuo disco a pezzi, quindi non lascia mai il tuo computer. Anche l'app desktop e la riga di comando convertono sul tuo computer.

### Quanto può essere grande il dump?

Il convertitore non tiene mai l'intero dump in memoria: legge il file due volte, per intervalli, e scrive lo script man mano. I dump di più gigabyte si convertono nel browser, nell'app desktop e con la riga di comando.

### Legge i dump di MariaDB?

Sì. I dump di mariadb-dump e di MariaDB dalla 10.3 alla 12 si convertono allo stesso modo, comprese le colonne INET6, INET4 e UUID di MariaDB.

### Cosa succede alle date 0000-00-00?

Oracle non ha una data zero, quindi diventano NULL e la colonna accetta NULL. Il report dice quante erano in ogni colonna. Anche le stringhe vuote diventano NULL, perché Oracle le salva così.

### I valori AUTO_INCREMENT vengono mantenuti?

Sì. Ogni colonna AUTO_INCREMENT diventa una colonna identity, ogni riga mantiene il suo id e l'id successivo riparte dopo il più alto, o dopo l'AUTO_INCREMENT della tabella se è maggiore.

### TINYINT(1) diventa boolean?

Oracle prima della 23ai non ha colonne booleane. Una colonna con valori tutti 0 o 1 diventa NUMBER(1) con un CHECK che la mantiene così; una che contiene altri numeri li mantiene, e il report spiega perché.

### E le stored procedure e i trigger?

Sono elencati per nome nel report e non vengono convertiti, perché ogni database li scrive nel proprio linguaggio. ON UPDATE CURRENT_TIMESTAMP è l'eccezione: diventa un trigger di Oracle.

### Su quali versioni di Oracle si carica lo script?

Oracle 19c e successive. Ogni dump di test si carica su 21c e 23ai, fermandosi al primo errore se qualcosa va storto.

## Da MySQL

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

## Verso Oracle

- [Da MariaDB a Oracle](https://intosql.com/it/mariadb-in-oracle)
- [Da PostgreSQL a Oracle](https://intosql.com/it/postgresql-in-oracle)
- [Da SQL Server a Oracle](https://intosql.com/it/sql-server-in-oracle)
- [Da SQLite a Oracle](https://intosql.com/it/sqlite-in-oracle)
- [Da Oracle a Oracle](https://intosql.com/it/oracle-in-oracle)

## Guida e tutte le coppie

- [Da Oracle a MySQL](https://intosql.com/it/oracle-in-mysql)
- [Guida alla migrazione da MySQL a Oracle](https://intosql.com/docs/migrations/mysql-to-oracle)
- [Tipi di dati da MySQL a Oracle](https://intosql.com/docs/types/mysql-to-oracle)
- [Tutte le coppie di database](https://intosql.com/it/migrazione-database)
