Converti Oracle in MySQL
Trascina il file .sql che scrive Database Export di SQL Developer o SQLcl, con le sue tabelle e istruzioni Insert, e scarica uno script per MySQL con le stesse tabelle, chiavi, indici e dati. Ogni valore che MySQL non può contenere così com'è, e ogni oggetto che non supporta, è elencato nel report.
18 righe convertite, nessuna correzione, nessuna rifiutata
Tabelle in shop_2024_oracle.sqlDump Oracle · scritto da SQL Developer · utf-8
customers8 righe
7 colonne id bigint not null name varchar(100) not null email varchar(150) not null country char(2) not null is_active smallint not null signed_up datetime created_at datetime not null orders10 righe
9 colonne id bigint not null customer_id bigint not null invoice bigint status varchar(10) not null total decimal(10,2) not null items int not null ordered_at datetime not null shipped_at datetime note varchar(255)
-- Written by IntoSQL from a Oracle dump. Load it with: mysql --default-character-set=utf8mb4 <database> < <file>
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO,ALLOW_INVALID_DATES';
CREATE TABLE `customers` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`email` varchar(150) NOT NULL,
`country` char(2) NOT NULL DEFAULT 'US',
`is_active` smallint NOT NULL DEFAULT 1,
`signed_up` datetime,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `customers_email_uk` (`email`),
CONSTRAINT `check1` CHECK (`is_active` IN (0, 1))
) AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='People who bought at least once';
CREATE TABLE `orders` (
`id` bigint NOT NULL AUTO_INCREMENT,
`customer_id` bigint NOT NULL,
`invoice` bigint,
`status` varchar(10) NOT NULL DEFAULT 'pending',
`total` decimal(10,2) NOT NULL,
`items` int NOT NULL DEFAULT 1,
`ordered_at` datetime NOT NULL,
`shipped_at` datetime,
`note` varchar(255),
PRIMARY KEY (`id`),
KEY `orders_status_date_ix` (`status`,`ordered_at`),
CONSTRAINT `check1` CHECK (`status` IN ('pending', 'paid', 'shipped', 'cancelled')),
CONSTRAINT `orders_customer_fk` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`)
) AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (1,'Ana Martínez','ana@example.com','MX',1,'2023-01-15 00:00:00','2023-01-15 10:24:00.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (2,'Zoë Müller','zoe@example.de','DE',1,'2023-02-03 00:00:00','2023-02-03 08:11:42.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (3,'José Peña','jose@example.es','ES',0,'2023-03-21 00:00:00','2023-03-21 19:05:17.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (4,'李雷','lilei@example.cn','CN',1,'2023-05-09 00:00:00','2023-05-09 02:40:00.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (5,'Noah O\'Brien','noah@example.ie','IE',1,NULL,'2023-06-30 14:00:00.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (6,'Amélie Laurent','amelie@example.fr','FR',1,'2024-01-02 00:00:00','2024-01-02 09:30:00.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (7,'Ravi Patel','ravi@example.in','IN',0,'2024-02-29 00:00:00','2024-02-29 23:59:59.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (8,'Sofia Rossi 🌻','sofia@example.it','IT',1,'2024-04-12 00:00:00','2024-04-12 12:12:12.000000');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (1,1,1000,'shipped',129.9,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL);
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (2,2,1001,'paid',54,1,'2024-03-02 11:15:00',NULL,'Gift wrap 🎁');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (3,1,1002,'cancelled',12.5,1,'2024-03-03 09:45:00',NULL,'Customer changed their mind');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (4,4,1003,'shipped',980,12,'2024-03-05 02:10:00','2024-03-07 08:00:00','请小心轻放');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (5,5,1004,'pending',45.75,2,'2024-03-08 17:20:00',NULL,'Leave at the door; ring twice');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (6,6,1005,'shipped',310.4,5,'2024-03-10 13:00:00','2024-03-11 09:00:00','Fragile: "glass"');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (7,8,1006,'paid',76.2,2,'2024-03-11 18:45:00',NULL,NULL);
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (8,2,1007,'paid',19.99,1,'2024-03-12 08:00:00',NULL,'Paid at the counter');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (9,3,1008,'shipped',64,2,'2024-03-14 15:30:00',NULL,'Shipping date never recorded');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (10,7,1009,'paid',1499,1,'2024-03-15 21:05:00',NULL,'C:\\Users\\ravi\\invoice.pdf');
SET UNIQUE_CHECKS = 1;
SET FOREIGN_KEY_CHECKS = 1;
Correzioni
Non c'era niente da correggere.
Da controllare
- 1 sequenza non viene creata; MySQL non ha sequenze. Tieni il valore successivo in una tabella se la tua applicazione ne ha bisogno.
- Il valore predefinito di "invoice" in orders non si può scrivere per MySQL (a sequence), quindi la colonna non ha un valore predefinito. Aggiungi a mano il valore predefinito se le nuove righe ne hanno bisogno.
Il tuo file viene convertito su questo computer e non viene mai caricato.
Altri esempi:
Cosa cambia da Oracle a MySQL
Ogni riga è una regola che il convertitore applica, con la riga del report che scrive quando la regola cambia qualcosa nei tuoi dati.
BOOLEAN (23ai)
tinyint(1)
MySQL non ha una colonna booleana, quindi TRUE e FALSE sono 1 e 0.
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG
varchar(n) fino a 1024 caratteri, tipi text oltre
Le lunghezze contano i caratteri, sia che Oracle contasse byte sia caratteri, quindi ogni valore ci sta.
NUMBER, NUMBER(p,s), FLOAT(b)
decimal(p,s), o bigint
NUMBER mantiene ogni cifra; un NUMBER senza precisione i cui valori sono tutti numeri interi fino a 18 cifre è un intero a 64 bit, e una scala negativa contiene altrettante cifre prima della virgola.
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND
varchar(100) con il testo di Oracle, come +01-06
Il TIME di MySQL contiene durate fino a 838 ore, e non ha anni né mesi; il testo mantiene ogni parte.
Riga del report: type_replaced
DATE, TIMESTAMP(p)
datetime(p)
Il DATE di Oracle contiene un'ora al secondo, quindi è una data e ora. Un export in una sessione americana o tedesca scrive le date senza ora né secolo (DD-MON-RR); esporta in una sessione ISO (SYYYY-MM-DD HH24:MI:SS) per mantenerle.
TIMESTAMP(7) to TIMESTAMP(9)
sei cifre di secondo, la settima troncata
MySQL mantiene i microsecondi; la settima cifra (100 nanosecondi) viene troncata, mai arrotondata, quindi nessun valore passa al secondo o al giorno successivo.
Riga del report: fraction_cut
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE
datetime(p) in UTC
Il TIMESTAMP di MySQL arriva solo al 2038, quindi gli istanti sono salvati come datetime in UTC, lo stesso istante qualunque offset avesse ogni valore.
Riga del report: moments_as_utc
JSON (21c), and CLOB holding JSON
json
Gli stessi valori JSON; un NULL SQL che l'export ha scritto come 'null' resta NULL.
BLOB, RAW(n), LONG RAW
binary(n), varbinary(n) e tipi blob
I byte restano byte.
ROWID, UROWID, XMLTYPE, SDO_GEOMETRY
text
I tipi propri di Oracle non hanno un equivalente; i loro valori mantengono il testo, valori ROWID inclusi, anche se fuori da Oracle non significano nulla.
Riga del report: type_replaced
collations that ignore case (BINARY_CI)
confronto esatto (utf8mb4_bin)
Le tabelle usano utf8mb4_bin così le chiavi uniche distinguono ciò che Oracle distingueva; le colonne che ignoravano le maiuscole lo perdono. Le regole sugli accenti cambiano tra versioni, quindi nessuna collation _ci coincide con quella di Oracle su tutte.
Riga del report: case_insensitive_collation
identity columns, and a sequence a BEFORE INSERT trigger assigns
AUTO_INCREMENT, che riparte dopo l'id più alto
Gli id copiati si caricano così come sono, e il contatore riparte dopo il più alto. Anche una colonna che un trigger riempie da una sequenza (il metodo prima della 12c) è una identity.
identity columns the target can't count
un intero semplice
MySQL conta una colonna per tabella, all'inizio di una chiave; ogni altra mantiene i suoi valori senza contatore.
Riga del report: counter_dropped
CREATE SEQUENCE
non creato
L'export scrive fin dove è arrivata una sequenza come suo START WITH, quindi riparte da lì.
Riga del report: sequence_not_converted
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)
colonne generate, STORED se PERSISTED, altrimenti VIRTUAL
MySQL le calcola con la stessa formula; i valori che l'export ha scritto per loro vengono omessi.
virtual columns with functions IntoSQL doesn't write, and the || operator
una colonna semplice
Una formula che non si può scrivere per MySQL lascia una colonna semplice e una riga nel report; i valori che l'export ha scritto per le colonne virtuali vengono omessi, e MySQL non ne ha nessuno da calcolare.
Riga del report: generated_not_translated
defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)
nessun valore predefinito
Un valore predefinito che non si può scrivere viene omesso e segnalato.
Riga del report: default_not_translated
CHECK constraints
tradotti
MySQL 5.7 li mantiene senza verificarli; gli altri li verificano mentre si carica ogni riga.
CHECK constraints with functions IntoSQL doesn't write
non creato
Un vincolo CHECK che non si può scrivere viene omesso e segnalato.
Riga del report: check_skipped
CHECK constraints that are DISABLE or ENABLE NOVALIDATE
non creato
Oracle non applica questi vincoli CHECK alle righe già presenti, quindi le righe potrebbero violarli.
Riga del report: check_not_enforced
function-based, bitmap and domain indexes
non creato
IntoSQL scrive indici b-tree su colonne intere; ricrea gli altri dopo il caricamento.
Riga del report: index_skipped
foreign keys
chiavi esterne, caricate con FOREIGN_KEY_CHECKS=0
Le righe si caricano in qualsiasi ordine, e le chiavi verificano le nuove righe dopo.
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE ones
non creato
Una chiave non può riferirsi a una tabella che non c'è, e una che Oracle non verifica può avere righe senza padre.
Riga del report: foreign_key_skipped
partitioned tables
una tabella con le righe di ogni partizione
Le righe sono le stesse; partiziona di nuovo la tabella in MySQL se serve.
Riga del report: partitions_dropped
several schemas in one export
un database, tabelle con il nome del loro schema davanti
Gli schemi di MySQL sono database, che un export caricato in un solo database non può creare; un export di un solo schema mantiene i nomi delle sue tabelle.
Riga del report: schemas_merged
NOT NULL columns with values that become NULL
NOT NULL rimosso
Una colonna i cui valori sono dovuti diventare NULL non può mantenere NOT NULL, altrimenti il caricamento si fermerebbe.
Riga del report: not_null_relaxed
views, synonyms, types, packages, procedures, functions and other triggers
elencati nel report
Il loro codice è scritto in PL/SQL, quindi vengono elencati perché tu li ricrei.
Riga del report: not_converted_objects
exports without CREATE TABLE (data only)
tipi ricavati dai valori
Un export di soli dati contiene solo righe, quindi i tipi vengono ricavati dai valori.
Riga del report: no_schema
expressions in INSERT values other than the ones exports write
NULL
Un convertitore che non esegue un database non può valutarle; to_date, to_timestamp, TO_CLOB, HEXTORAW e le altre che scrivono gli export vengono lette.
Riga del report: expression_value
types IntoSQL doesn't know, and object types
longtext
Il testo contiene qualsiasi valore; cambia il tipo dopo il caricamento.
Riga del report: unknown_type
dates before year 1 and time zones given as region names
NULL
MySQL salva gli anni dal 1000 al 9999, e Oracle risale fino all'anno 1. Quei valori diventano NULL e il report li conta.
Riga del report: date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE
NULL
I tipi a virgola mobile di MySQL non hanno NaN né infinito, quindi quei valori diventano NULL e il report li conta.
Riga del report: invalid_value_null
NUL characters in text
mantenuto
Il valore viene copiato con il carattere NUL in escape.
text that isn't valid in its encoding
i byte errati come carattere di sostituzione
Lo script è in UTF-8 e ogni valore deve essere testo valido.
Riga del report: invalid_utf8_replaced
text decoded twice (ñ)
copiato così com'è
Lo script contiene esattamente questi caratteri, quindi vengono copiati; il report li segnala.
Riga del report: mojibake_suspected
| In Oracle | In MySQL | Riga del report |
|---|---|---|
| BOOLEAN (23ai) | tinyint(1)MySQL non ha una colonna booleana, quindi TRUE e FALSE sono 1 e 0. | |
| VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG | varchar(n) fino a 1024 caratteri, tipi text oltreLe lunghezze contano i caratteri, sia che Oracle contasse byte sia caratteri, quindi ogni valore ci sta. | |
| NUMBER, NUMBER(p,s), FLOAT(b) | decimal(p,s), o bigintNUMBER mantiene ogni cifra; un NUMBER senza precisione i cui valori sono tutti numeri interi fino a 18 cifre è un intero a 64 bit, e una scala negativa contiene altrettante cifre prima della virgola. | |
| INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND | varchar(100) con il testo di Oracle, come +01-06Il TIME di MySQL contiene durate fino a 838 ore, e non ha anni né mesi; il testo mantiene ogni parte. | type_replaced |
| DATE, TIMESTAMP(p) | datetime(p)Il DATE di Oracle contiene un'ora al secondo, quindi è una data e ora. Un export in una sessione americana o tedesca scrive le date senza ora né secolo (DD-MON-RR); esporta in una sessione ISO (SYYYY-MM-DD HH24:MI:SS) per mantenerle. | |
| TIMESTAMP(7) to TIMESTAMP(9) | sei cifre di secondo, la settima troncataMySQL mantiene i microsecondi; la settima cifra (100 nanosecondi) viene troncata, mai arrotondata, quindi nessun valore passa al secondo o al giorno successivo. | fraction_cut |
| TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE | datetime(p) in UTCIl TIMESTAMP di MySQL arriva solo al 2038, quindi gli istanti sono salvati come datetime in UTC, lo stesso istante qualunque offset avesse ogni valore. | moments_as_utc |
| JSON (21c), and CLOB holding JSON | jsonGli stessi valori JSON; un NULL SQL che l'export ha scritto come 'null' resta NULL. | |
| BLOB, RAW(n), LONG RAW | binary(n), varbinary(n) e tipi blobI byte restano byte. | |
| ROWID, UROWID, XMLTYPE, SDO_GEOMETRY | textI tipi propri di Oracle non hanno un equivalente; i loro valori mantengono il testo, valori ROWID inclusi, anche se fuori da Oracle non significano nulla. | type_replaced |
| collations that ignore case (BINARY_CI) | confronto esatto (utf8mb4_bin)Le tabelle usano utf8mb4_bin così le chiavi uniche distinguono ciò che Oracle distingueva; le colonne che ignoravano le maiuscole lo perdono. Le regole sugli accenti cambiano tra versioni, quindi nessuna collation _ci coincide con quella di Oracle su tutte. | case_insensitive_collation |
| identity columns, and a sequence a BEFORE INSERT trigger assigns | AUTO_INCREMENT, che riparte dopo l'id più altoGli id copiati si caricano così come sono, e il contatore riparte dopo il più alto. Anche una colonna che un trigger riempie da una sequenza (il metodo prima della 12c) è una identity. | |
| identity columns the target can't count | un intero sempliceMySQL conta una colonna per tabella, all'inizio di una chiave; ogni altra mantiene i suoi valori senza contatore. | counter_dropped |
| CREATE SEQUENCE | non creatoL'export scrive fin dove è arrivata una sequenza come suo START WITH, quindi riparte da lì. | sequence_not_converted |
| virtual columns (GENERATED ALWAYS AS ... VIRTUAL) | colonne generate, STORED se PERSISTED, altrimenti VIRTUALMySQL le calcola con la stessa formula; i valori che l'export ha scritto per loro vengono omessi. | |
| virtual columns with functions IntoSQL doesn't write, and the || operator | una colonna sempliceUna formula che non si può scrivere per MySQL lascia una colonna semplice e una riga nel report; i valori che l'export ha scritto per le colonne virtuali vengono omessi, e MySQL non ne ha nessuno da calcolare. | generated_not_translated |
| defaults with functions IntoSQL doesn't write (SYS_GUID(), ||) | nessun valore predefinitoUn valore predefinito che non si può scrivere viene omesso e segnalato. | default_not_translated |
| CHECK constraints | tradottiMySQL 5.7 li mantiene senza verificarli; gli altri li verificano mentre si carica ogni riga. | |
| CHECK constraints with functions IntoSQL doesn't write | non creatoUn vincolo CHECK che non si può scrivere viene omesso e segnalato. | check_skipped |
| CHECK constraints that are DISABLE or ENABLE NOVALIDATE | non creatoOracle non applica questi vincoli CHECK alle righe già presenti, quindi le righe potrebbero violarli. | check_not_enforced |
| function-based, bitmap and domain indexes | non creatoIntoSQL scrive indici b-tree su colonne intere; ricrea gli altri dopo il caricamento. | index_skipped |
| foreign keys | chiavi esterne, caricate con FOREIGN_KEY_CHECKS=0Le righe si caricano in qualsiasi ordine, e le chiavi verificano le nuove righe dopo. | |
| foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE ones | non creatoUna chiave non può riferirsi a una tabella che non c'è, e una che Oracle non verifica può avere righe senza padre. | foreign_key_skipped |
| partitioned tables | una tabella con le righe di ogni partizioneLe righe sono le stesse; partiziona di nuovo la tabella in MySQL se serve. | partitions_dropped |
| several schemas in one export | un database, tabelle con il nome del loro schema davantiGli schemi di MySQL sono database, che un export caricato in un solo database non può creare; un export di un solo schema mantiene i nomi delle sue tabelle. | schemas_merged |
| NOT NULL columns with values that become NULL | NOT NULL rimossoUna colonna i cui valori sono dovuti diventare NULL non può mantenere NOT NULL, altrimenti il caricamento si fermerebbe. | not_null_relaxed |
| views, synonyms, types, packages, procedures, functions and other triggers | elencati nel reportIl loro codice è scritto in PL/SQL, quindi vengono elencati perché tu li ricrei. | not_converted_objects |
| exports without CREATE TABLE (data only) | tipi ricavati dai valoriUn export di soli dati contiene solo righe, quindi i tipi vengono ricavati dai valori. | no_schema |
| expressions in INSERT values other than the ones exports write | NULLUn convertitore che non esegue un database non può valutarle; to_date, to_timestamp, TO_CLOB, HEXTORAW e le altre che scrivono gli export vengono lette. | expression_value |
| types IntoSQL doesn't know, and object types | longtextIl testo contiene qualsiasi valore; cambia il tipo dopo il caricamento. | unknown_type |
| dates before year 1 and time zones given as region names | NULLMySQL salva gli anni dal 1000 al 9999, e Oracle risale fino all'anno 1. Quei valori diventano NULL e il report li conta. | date_out_of_range |
| NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE | NULLI tipi a virgola mobile di MySQL non hanno NaN né infinito, quindi quei valori diventano NULL e il report li conta. | invalid_value_null |
| NUL characters in text | mantenutoIl valore viene copiato con il carattere NUL in escape. | |
| text that isn't valid in its encoding | i byte errati come carattere di sostituzioneLo script è in UTF-8 e ogni valore deve essere testo valido. | invalid_utf8_replaced |
| text decoded twice (ñ) | copiato così com'èLo script contiene esattamente questi caratteri, quindi vengono copiati; il report li segnala. | mojibake_suspected |
Carica lo script in MySQL
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.
mysql --default-character-set=utf8mb4 mydb < oracle.mysql.sqlLe chiavi esterne vengono create come le dichiara il dump, con FOREIGN_KEY_CHECKS=0 mentre le righe si caricano, così una riga che punta a una riga mancante non ferma il caricamento.
Per un dump grande, esegui il client sulla stessa macchina del server, e aumenta max_allowed_packet se una singola riga è molto grande.
IntoSQL Pro carica il file direttamente in MySQL dall'app desktop o dalla riga di comando, senza scrivere uno script.
Fai il dump di Oracle per il miglior risultato
Il convertitore legge ciò che il dump contiene. Con queste opzioni il dump conserva più dei tuoi dati:
- In SQL Developer, scegli Tools, Database Export, con DDL e il formato dati Insert. SQLcl scrive lo stesso con SET SQLFORMAT INSERT.
- Esegui ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' prima di esportare: il formato di default scrive le date senza ora né secolo.
- Un file .dmp di exp o expdp è binario: importalo in un database Oracle, per esempio Oracle Database Free in Docker, ed esportalo con SQL Developer.
Cosa non viene convertito
Viste, package, procedure, funzioni, trigger, tipi e sinonimi sono scritti in PL/SQL. Sono elencati per nome nel report, mai rimossi in silenzio, così puoi riscriverli per MySQL.
Domande sulla conversione da Oracle a MySQL
Non trovi la risposta? Scrivici dalla pagina dei contatti e ti risponde una persona. Pagina dei contatti
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.
Posso convertire un file .dmp di exp o expdp?
Non direttamente: Data Pump e l'Export originale scrivono un formato binario che legge solo Oracle. Importalo in un qualsiasi database Oracle, Oracle Database Free gira in Docker, ed esportalo con Database Export di SQL Developer o con SQLcl. Il convertitore lo segnala quando riceve un file .dmp.
Da quali versioni di Oracle può provenire l'export?
Export di SQL Developer e SQLcl, con le definizioni di tabella di DBMS_METADATA, da Oracle 11g in poi. Ogni export di test viene da Oracle 21c e 23ai, in sessioni americane, tedesche e ISO, ed è confrontato con la sorgente cella per cella.
Cosa succede a NUMBER, DATE e agli altri tipi di Oracle?
NUMBER diventa decimal, o bigint per i numeri interi, e testo oltre le 65 cifre; DATE diventa datetime, mantenendo l'ora; CLOB longtext, BLOB blob, e gli intervalli mantengono il testo di Oracle. NaN e Infinity diventano NULL e il report li conta.
Le colonne identity e le sequenze vengono mantenute?
Le colonne identity diventano AUTO_INCREMENT e ripartono dopo l'id più alto. MySQL non ha sequenze, quindi sono segnalate nel report, come i valori di default che le usano.
E package, procedure e trigger PL/SQL?
Sono elencati per nome nel report e non vengono convertiti, perché ogni database li scrive nel proprio linguaggio.
Su quali versioni di MySQL si carica lo script?
MySQL 5.7 e successive. Ogni export di test si carica su 5.7 e 9, fermandosi al primo errore se qualcosa va storto.