Convertir MariaDB en Oracle
Déposez un dump de mariadb-dump, mysqldump, phpMyAdmin ou Adminer, en .sql ou .sql.gz, et téléchargez un script Oracle avec les mêmes tables, clés, index et données. Chaque valeur que Oracle ne peut pas contenir telle quelle, et chaque objet qu'il ne reprend pas, est listé dans le rapport.
18 lignes converties, 4 corrections, aucune rejetée
Tables de shop_2024_mariadb.sqlDump MariaDB 11.8.9-MariaDB-ubu2404 · écrit par mariadb-dump · utf8mb4
customersécrite sous le nom CUSTOMERS8 lignes2
8 colonnes ID NUMBER(10) not null NAME VARCHAR2(100 CHAR) not null EMAIL VARCHAR2(150 CHAR) not null COUNTRY VARCHAR2(2 CHAR) not null IS_ACTIVE NUMBER(1) not null SIGNED_UP DATE CREATED_AT TIMESTAMP(0) WITH TIME ZONE not null LAST_IP VARCHAR2(39 CHAR) ordersécrite sous le nom ORDERS10 lignes2
12 colonnes ID NUMBER(10) not null CUSTOMER_ID NUMBER(10) not null STATUS VARCHAR2(9 CHAR) TOTAL NUMBER(10,2) not null ITEMS NUMBER(5) not null ORDERED_AT TIMESTAMP(0) not null SHIPPED_AT TIMESTAMP(0) NOTE VARCHAR2(255 CHAR) ORDER_REF VARCHAR2(36 CHAR) not null INVOICE NUMBER(10) not null DETAILS CLOB UPDATED_AT TIMESTAMP(0) WITH TIME ZONE not null
-- Written by IntoSQL from a MySQL dump. Load it with: NLS_LANG=.AL32UTF8 sqlplus -S -L <user>/<password>@<database> @<file>
WHENEVER SQLERROR EXIT FAILURE ROLLBACK;
SET DEFINE OFF;
SET SQLBLANKLINES ON;
SET FEEDBACK OFF;
SET SERVEROUTPUT ON;
CREATE OR REPLACE FUNCTION "INTOSQL_CLOB" (p SYS.ODCIVARCHAR2LIST) RETURN CLOB IS
r CLOB;
BEGIN
DBMS_LOB.CREATETEMPORARY(r, TRUE);
FOR i IN 1 .. p.COUNT LOOP
IF p(i) IS NOT NULL THEN
DBMS_LOB.WRITEAPPEND(r, LENGTH2(p(i)), p(i));
END IF;
END LOOP;
RETURN r;
END;
/
CREATE OR REPLACE FUNCTION "INTOSQL_BLOB" (p SYS.ODCIVARCHAR2LIST) RETURN BLOB IS
r BLOB;
piece RAW(2000);
BEGIN
DBMS_LOB.CREATETEMPORARY(r, TRUE);
FOR i IN 1 .. p.COUNT LOOP
piece := HEXTORAW(p(i));
DBMS_LOB.WRITEAPPEND(r, UTL_RAW.LENGTH(piece), piece);
END LOOP;
RETURN r;
END;
/
CREATE SEQUENCE "INVOICE_NUMBERS" START WITH 2000 INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775806;
CREATE TABLE "CUSTOMERS" (
"ID" NUMBER(10) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 1001),
"NAME" VARCHAR2(100 CHAR) NOT NULL,
"EMAIL" VARCHAR2(150 CHAR) NOT NULL,
"COUNTRY" VARCHAR2(2 CHAR) DEFAULT 'US' NOT NULL,
"IS_ACTIVE" NUMBER(1) DEFAULT 1 NOT NULL,
"SIGNED_UP" DATE,
"CREATED_AT" TIMESTAMP(0) WITH TIME ZONE DEFAULT SYSTIMESTAMP NOT NULL,
"LAST_IP" VARCHAR2(39 CHAR),
CONSTRAINT "CK_CUSTOMERS_ID" CHECK ("ID" >= 0),
CONSTRAINT "CK_CUSTOMERS_IS_ACTIVE" CHECK ("IS_ACTIVE" IN (0, 1))
);
CREATE TABLE "ORDERS" (
"ID" NUMBER(10) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 5001),
"CUSTOMER_ID" NUMBER(10) NOT NULL,
"STATUS" VARCHAR2(9 CHAR) DEFAULT 'pending',
"TOTAL" NUMBER(10,2) NOT NULL,
"ITEMS" NUMBER(5) DEFAULT 1 NOT NULL,
"ORDERED_AT" TIMESTAMP(0) NOT NULL,
"SHIPPED_AT" TIMESTAMP(0),
"NOTE" VARCHAR2(255 CHAR),
"ORDER_REF" VARCHAR2(36 CHAR) NOT NULL,
"INVOICE" NUMBER(10) DEFAULT ("INVOICE_NUMBERS".NEXTVAL) NOT NULL,
"DETAILS" CLOB,
"UPDATED_AT" TIMESTAMP(0) WITH TIME ZONE DEFAULT SYSTIMESTAMP NOT NULL,
CONSTRAINT "CK_ORDERS_ID" CHECK ("ID" >= 0),
CONSTRAINT "CK_ORDERS_CUSTOMER_ID" CHECK ("CUSTOMER_ID" >= 0),
CONSTRAINT "CK_ORDERS_STATUS" CHECK ("STATUS" IN ('pending', 'paid', 'shipped', 'cancelled')),
CONSTRAINT "CK_ORDERS_ITEMS" CHECK ("ITEMS" >= 0)
);
BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT",
"LAST_IP"
) VALUES (
1,
'Ana Martínez',
'ana@example.com',
'MX',
1,
DATE '2023-01-15',
TIMESTAMP '2023-01-15 10:24:00 +00:00',
'::ffff:203.0.113.7'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT",
"LAST_IP"
) VALUES (
2,
'Zoë Müller',
'zoe@example.de',
'DE',
1,
DATE '2023-02-03',
TIMESTAMP '2023-02-03 08:11:42 +00:00',
'2001:db8::1'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT",
"LAST_IP"
) VALUES (
3,
'José Peña',
'jose@example.es',
'ES',
0,
DATE '2023-03-21',
TIMESTAMP '2023-03-21 19:05:17 +00:00',
NULL
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT",
"LAST_IP"
) VALUES (
4,
'李雷',
'lilei@example.cn',
'CN',
1,
DATE '2023-05-09',
TIMESTAMP '2023-05-09 02:40:00 +00:00',
'::ffff:198.51.100.23'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT",
"LAST_IP"
) VALUES (
5,
'Noah O''Brien',
'noah@example.ie',
'IE',
1,
NULL,
TIMESTAMP '2023-06-30 14:00:00 +00:00',
NULL
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT",
"LAST_IP"
) VALUES (
6,
'Amélie Laurent',
'amelie@example.fr',
'FR',
1,
DATE '2024-01-02',
TIMESTAMP '2024-01-02 09:30:00 +00:00',
'2001:db8:85a3::8a2e:370:7334'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT",
"LAST_IP"
) VALUES (
7,
'Ravi Patel',
'ravi@example.in',
'IN',
0,
DATE '2024-02-29',
TIMESTAMP '2024-02-29 23:59:59 +00:00',
'::ffff:192.0.2.200'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT",
"LAST_IP"
) VALUES (
8,
'Sofia Rossi 🌻',
'sofia@example.it',
'IT',
1,
DATE '2024-04-12',
TIMESTAMP '2024-04-12 12:12:12 +00:00',
NULL
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
1,
1,
'shipped',
129.90,
3,
TIMESTAMP '2024-03-01 10:00:00',
TIMESTAMP '2024-03-02 16:30:00',
NULL,
'0b7a4c2e-3f1d-4e8a-9c55-1a2b3c4d5e6f',
1000,
'{"gift": false}',
TIMESTAMP '2024-03-02 16:30:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
2,
2,
'paid',
54.00,
1,
TIMESTAMP '2024-03-02 11:15:00',
NULL,
'Gift wrap 🎁',
'1c8b5d3f-4a2e-4f9b-8d66-2b3c4d5e6f70',
1001,
'{"gift": true, "wrap": "red"}',
TIMESTAMP '2024-03-02 11:20:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
3,
1,
'cancelled',
12.50,
1,
TIMESTAMP '2024-03-03 09:45:00',
NULL,
'Customer changed their mind',
'2d9c6e4a-5b3f-4a0c-9e77-3c4d5e6f7081',
1002,
NULL,
TIMESTAMP '2024-03-03 10:00:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
4,
4,
'shipped',
980.00,
12,
TIMESTAMP '2024-03-05 02:10:00',
TIMESTAMP '2024-03-07 08:00:00',
'请小心轻放',
'3e0d7f5b-6c4a-4b1d-8f88-4d5e6f708192',
1003,
'{"fragile": true}',
TIMESTAMP '2024-03-07 08:00:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
5,
5,
'pending',
45.75,
2,
TIMESTAMP '2024-03-08 17:20:00',
NULL,
'Leave at the door; ring twice',
'4f1e806c-7d5b-4c2e-9a99-5e6f708192a3',
1004,
NULL,
TIMESTAMP '2024-03-08 17:20:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
6,
6,
'shipped',
310.40,
5,
TIMESTAMP '2024-03-10 13:00:00',
TIMESTAMP '2024-03-11 09:00:00',
'Fragile: "glass"',
'50f2917d-8e6c-4d3f-8baa-6f708192a3b4',
1005,
'{"fragile": true}',
TIMESTAMP '2024-03-11 09:00:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
7,
8,
'paid',
76.20,
2,
TIMESTAMP '2024-03-11 18:45:00',
NULL,
NULL,
'6103a28e-9f7d-4e40-9cbb-708192a3b4c5',
1006,
NULL,
TIMESTAMP '2024-03-11 18:46:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
8,
2,
NULL,
19.99,
1,
TIMESTAMP '2024-03-12 08:00:00',
NULL,
'Status lost in an old import',
'7214b39f-a08e-4f51-8dcc-8192a3b4c5d6',
1007,
NULL,
TIMESTAMP '2024-03-12 08:00:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
9,
3,
'shipped',
64.00,
2,
TIMESTAMP '2024-03-14 15:30:00',
NULL,
'Shipping date never recorded',
'8325c4a0-b19f-4062-9edd-92a3b4c5d6e7',
1008,
'{"parcels": [1, 2]}',
TIMESTAMP '2024-03-15 10:00:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
10,
7,
'paid',
1499.00,
1,
TIMESTAMP '2024-03-15 21:05:00',
NULL,
'C:\Users\ravi\invoice.pdf',
'9436d5b1-c2a0-4173-8fee-a3b4c5d6e7f8',
1009,
NULL,
TIMESTAMP '2024-03-15 21:05:00 +00:00'
);
COMMIT;
END;
/
-- Keys, indexes, foreign keys, counters and triggers, after the rows.
ALTER TABLE "CUSTOMERS" ADD CONSTRAINT "PK_CUSTOMERS" PRIMARY KEY ("ID");
ALTER TABLE "CUSTOMERS" ADD CONSTRAINT "UQ_CUSTOMERS_UQ_EMAIL" UNIQUE ("EMAIL");
ALTER TABLE "ORDERS" ADD CONSTRAINT "PK_ORDERS" PRIMARY KEY ("ID");
CREATE INDEX "IX_ORDERS_IDX_CUSTOMER" ON "ORDERS" ("CUSTOMER_ID");
CREATE INDEX "IX_ORDERS_IDX_STATUS_DATE" ON "ORDERS" ("STATUS", "ORDERED_AT");
ALTER TABLE "ORDERS" ADD CONSTRAINT "FK_ORDERS_CUSTOMER" FOREIGN KEY ("CUSTOMER_ID") REFERENCES "CUSTOMERS" ("ID") ENABLE NOVALIDATE;
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE "ORDERS" ENABLE VALIDATE CONSTRAINT "FK_ORDERS_CUSTOMER"';
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Foreign key ' || '"FK_ORDERS_CUSTOMER"' || ' has rows without a parent: it stays unvalidated, and new rows are checked.');
END;
/
DECLARE
next_id NUMBER;
BEGIN
SELECT NVL(MAX("ID"), 0) + 1 INTO next_id FROM "CUSTOMERS";
IF next_id < 1001 THEN
next_id := 1001;
END IF;
EXECUTE IMMEDIATE 'ALTER TABLE "CUSTOMERS" MODIFY ("ID" GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH ' || next_id || '))';
END;
/
COMMENT ON TABLE "CUSTOMERS" IS 'People who bought at least once';
DECLARE
next_id NUMBER;
BEGIN
SELECT NVL(MAX("ID"), 0) + 1 INTO next_id FROM "ORDERS";
IF next_id < 5001 THEN
next_id := 5001;
END IF;
EXECUTE IMMEDIATE 'ALTER TABLE "ORDERS" MODIFY ("ID" GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH ' || next_id || '))';
END;
/
CREATE OR REPLACE TRIGGER "TR_ORDERS_UPDATED_AT" BEFORE UPDATE ON "ORDERS" FOR EACH ROW
BEGIN
IF NOT UPDATING('UPDATED_AT') THEN
:NEW."UPDATED_AT" := SYSTIMESTAMP;
END IF;
END;
/
DROP FUNCTION "INTOSQL_CLOB";
DROP FUNCTION "INTOSQL_BLOB";
COMMIT;
EXIT;
Corrections
- "signed_up" de customers accepte maintenant NULL : certaines de ses valeurs ne pouvaient pas être stockées et sont NULL.
- La valeur par défaut de "signed_up" dans customers, 0000‑00‑00, n'est pas une date acceptée par Oracle ; la colonne n'a donc pas de valeur par défaut.
- "status" de orders accepte maintenant NULL : certaines de ses valeurs ne pouvaient pas être stockées et sont NULL.
- "updated_at" de orders passe à l'heure actuelle à chaque mise à jour ; dans Oracle, un déclencheur s'en charge.
À vérifier
- 1 valeur dans "signed_up" de customers est une date zéro ou impossible, comme 0000‑00‑00, que Oracle ne peut pas stocker ; elle est donc NULL. Si ces dates ont un sens, remplacez-les dans la source par de vraies dates avant le dump.
- 1 valeur dans "shipped_at" de orders est une date zéro ou impossible, comme 0000‑00‑00 00:00:00, que Oracle ne peut pas stocker ; elle est donc NULL. Si ces dates ont un sens, remplacez-les dans la source par de vraies dates avant le dump.
- 1 valeur vide dans "status" de orders est devenue NULL ; Oracle stocke une chaîne vide comme NULL. Là où des requêtes comparent cette colonne avec ', comparez plutôt avec IS NULL.
Votre fichier est converti sur cet ordinateur et n'est jamais envoyé.
Autres exemples :
Ce qui change de MariaDB à Oracle
Chaque ligne est une règle appliquée par le convertisseur, avec la ligne de rapport qu'il écrit quand la règle change quelque chose dans vos données.
TINYINT(1), BOOL
NUMBER(1) avec un CHECK de 0 et 1 si chaque valeur vaut 0 ou 1, sinon NUMBER(3)
Le BOOL de MySQL est un TINYINT(1) qui peut contenir tout nombre de -128 à 127. Oracle avant 23ai n'a pas de colonne booléenne, donc une colonne de 0 et 1 devient NUMBER(1) avec un CHECK ; une colonne qui contient 2 ou -1 garde ses nombres.
Ligne du rapport: bool_kept_numeric
UNSIGNED integers
NUMBER assez large pour la plage, avec un CHECK qui interdit les négatifs
Le NUMBER d'Oracle contient tout entier des largeurs de MySQL ; la contrainte CHECK écarte les valeurs négatives comme le faisait MySQL.
ZEROFILL and display widths
supprimé
Le remplissage par des zéros est une façon d'afficher un nombre, pas une partie du nombre. Les nombres sont conservés ; formatez-les à la lecture si le remplissage compte.
Ligne du rapport: zerofill_dropped
FLOAT(M,D)
BINARY_FLOAT ou BINARY_DOUBLE, sans l'échelle
Les flottants binaires d'Oracle n'ont pas d'échelle fixe. Les valeurs stockées sont copiées telles quelles.
Ligne du rapport: float_scale_dropped
DECIMAL(p,s)
NUMBER(p,s) jusqu'à 38 chiffres ; VARCHAR2 au-delà
Le NUMBER d'Oracle contient 38 chiffres. Les décimaux plus larges sont gardés en texte pour que chaque chiffre reste exact.
Ligne du rapport: decimal_as_text
BIT(1), BIT(n)
NUMBER(1), NUMBER(19) jusqu'à 63 bits, NUMBER(20) pour BIT(64)
Les champs de bits sont stockés comme le nombre que forment leurs bits.
zero, partial or impossible dates (0000-00-00, 2024-02-30)
NULL
Oracle ne stocke que de vraies dates du calendrier. MySQL garde les dates zéro et impossibles quand son mode SQL les autorise ; elles deviennent NULL et le rapport les compte.
Ligne du rapport: invalid_date_null
NOT NULL columns with values that become NULL
NOT NULL retiré
Une colonne dont des valeurs ont dû devenir NULL, chaînes vides comprises, ne peut pas garder NOT NULL, sinon le chargement s'arrêterait.
Ligne du rapport: not_null_relaxed
empty strings and empty binary values
NULL
Oracle stocke une chaîne vide comme NULL, donc une valeur qui valait ' se relit comme NULL. Le rapport les compte par colonne.
Ligne du rapport: empty_string_null
DEFAULT '0000-00-00'
aucune valeur par défaut
Une valeur par défaut qu'Oracle ne peut pas stocker est omise plutôt que remplacée par une date inventée.
Ligne du rapport: zero_date_default
TIME
INTERVAL DAY TO SECOND, qui contient des durées
Oracle n'a pas de type heure du jour, et le TIME de MySQL est une durée de -838:59:59 à 838:59:59 ; un intervalle contient chaque valeur.
YEAR
NUMBER(4) avec un CHECK de sa plage
Oracle n'a pas de type année ; le CHECK garde les mêmes valeurs que MySQL autorise.
CHAR(n), VARCHAR(n)
VARCHAR2(n CHAR), en caractères
Les longueurs comptent les caractères comme celles de MySQL, et MySQL renvoie les valeurs CHAR sans espaces de fin, telles que VARCHAR2 les garde.
VARCHAR(n) and TEXT longer than 4000 bytes
CLOB
Un VARCHAR2 contient 4000 octets par défaut, donc un texte plus long devient un CLOB ; une colonne dont toutes les valeurs tiennent garde VARCHAR2.
Ligne du rapport: text_as_lob
DATETIME
TIMESTAMP
Un DATETIME est une date et une heure locales, sans fuseau horaire, comme TIMESTAMP. DATE devient le DATE d'Oracle, qui contient aussi une heure du jour, laissée à minuit.
TIMESTAMP
TIMESTAMP WITH TIME ZONE dans le fuseau indiqué par le dump, UTC s'il n'en indique aucun
Un TIMESTAMP est un instant. Les dumps indiquent le fuseau dans lequel ils l'ont écrit (mysqldump écrit en UTC) ; sinon, les valeurs sont lues en UTC et le rapport le signale.
Ligne du rapport: timestamp_zone_assumed
ENUM
VARCHAR2 avec un CHECK de ses valeurs
Un texte avec une contrainte CHECK garde les mêmes valeurs.
ENUM holding '' (MySQL's error value)
NULL
MySQL stocke une chaîne vide quand une valeur invalide entre dans un ENUM avec un mode SQL permissif. Oracle la stocke comme NULL, ce que la contrainte CHECK autorise, et le rapport la compte avec les autres valeurs vides.
ENUM holding values outside its list
pas de CHECK
Les valeurs absentes de la liste feraient échouer la contrainte CHECK, qui n'est donc pas créée.
Ligne du rapport: enum_check_skipped
SET
VARCHAR2 tel que MySQL l'écrit ('a,b')
Oracle n'a pas de type ensemble ; le texte est celui que MySQL renvoie.
JSON
CLOB
Les fonctions JSON d'Oracle lisent le JSON depuis du texte sur chaque version, et un CLOB garde des valeurs de toute taille.
NUL bytes in text
conservé
VARCHAR2 et CLOB peuvent contenir un caractère NUL, donc la valeur est copiée telle quelle.
text that isn't valid in its character set
les octets invalides deviennent le caractère de remplacement
Le texte doit être lu comme des caractères pour être écrit en VARCHAR2.
Ligne du rapport: invalid_utf8_replaced
text decoded twice (ñ)
copié tel quel
Le dump contient exactement ces caractères, ils sont donc copiés ; le rapport les signale.
Ligne du rapport: mojibake_suspected
AUTO_INCREMENT
GENERATED BY DEFAULT ON NULL AS IDENTITY, redémarré après les identifiants copiés
Les identifiants copiés se chargent tels quels, et le compteur reprend après le plus élevé ou après l'AUTO_INCREMENT du dump, selon le plus grand.
MyISAM AUTO_INCREMENT on the second column of a key
un seul compteur pour la table
MyISAM compte par groupe de la première colonne de la clé ; Oracle a un compteur par table.
Ligne du rapport: myisam_group_autoincrement
ON UPDATE CURRENT_TIMESTAMP
un déclencheur BEFORE UPDATE
Le déclencheur met la colonne à l'heure actuelle quand une mise à jour ne la définit pas.
Ligne du rapport: on_update_trigger
generated columns
colonnes virtuelles
Oracle ne calcule les colonnes générées qu'à la lecture ; les colonnes STORED deviennent virtuelles avec les mêmes valeurs.
Ligne du rapport: stored_as_virtual
generated columns with functions Oracle lacks
une colonne simple
Une formule qui ne peut pas être écrite pour Oracle laisse une colonne simple et une ligne dans le rapport.
Ligne du rapport: generated_not_translated
INVISIBLE columns
colonnes INVISIBLE
Oracle cache les colonnes invisibles de SELECT * comme le fait MySQL.
CHECK constraints
traduites, en ligne dans CREATE TABLE
Les CHECK en ligne sont vérifiés au chargement de chaque ligne.
CHECK constraints with functions Oracle lacks
non créée
Une contrainte CHECK qui ne peut pas être écrite pour Oracle est omise et signalée.
Ligne du rapport: check_skipped
CHECK ... NOT ENFORCED
non créée
MySQL garde ces contraintes CHECK sans les appliquer, donc les lignes peuvent les enfreindre.
Ligne du rapport: check_not_enforced
defaults with functions Oracle lacks
aucune valeur par défaut
Une valeur par défaut qui ne peut pas être écrite pour Oracle est omise et signalée.
Ligne du rapport: default_not_translated
keys and indexes on a prefix, c(20)
un index sur SUBSTR de la colonne
Un index de fonction sur le même début de la colonne distingue les mêmes lignes, et indexe les colonnes CLOB qu'Oracle ne peut pas indexer en entier.
Ligne du rapport: prefix_unique
FULLTEXT indexes
non créée
Oracle Text gère la recherche plein texte avec son propre type d'index et ses propres requêtes.
Ligne du rapport: fulltext_not_created
SPATIAL indexes
non créée
Les géométries sont stockées en octets WKB, qu'un index spatial ne sait pas lire.
Ligne du rapport: spatial_index_not_created
functional indexes, and indexes on whole CLOB or BLOB columns
non créé
Oracle ne peut pas indexer un objet volumineux en entier, et certaines fonctions MySQL n'ont pas d'équivalent Oracle.
Ligne du rapport: index_skipped
foreign keys
après les données ENABLE NOVALIDATE, puis validée avec un avertissement sur les orphelins
Les dumps se chargent avec FOREIGN_KEY_CHECKS=0 et MyISAM ne vérifie jamais, donc les lignes sans parent sont fréquentes. La clé vérifie tout de suite les nouvelles lignes et est validée en dernier ; des orphelins la laissent non validée avec un avertissement au lieu d'arrêter le chargement.
ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT
supprimé
Les clés étrangères d'Oracle n'agissent qu'à la suppression, avec CASCADE ou SET NULL.
Ligne du rapport: foreign_key_action_unsupported
foreign keys to columns without a unique key
non créée
Oracle exige une clé primaire ou une contrainte unique sur les colonnes référencées ; InnoDB non.
Ligne du rapport: foreign_key_skipped
table and column names
en majuscules pour les noms simples, sinon tels qu'écrits
Oracle stocke en majuscules les noms écrits sans guillemets ; les noms simples passent donc en majuscules et les requêtes peuvent omettre les guillemets. Les autres noms gardent leur casse et exigent des guillemets.
Ligne du rapport: identifier_renamed
names over 128 bytes
raccourci
Depuis Oracle 12.2, les noms font 128 octets au plus.
Ligne du rapport: name_shortened
GEOMETRY, POINT, POLYGON...
BLOB contenant du WKB
WKB est la forme standard que lit chaque bibliothèque spatiale ; SDO_GEOMETRY exige les métadonnées d'Oracle Spatial.
Ligne du rapport: geometry_as_blob
INET4, INET6, UUID (MariaDB)
VARCHAR2(39), VARCHAR2(36)
Oracle n'a aucun de ces types ; le texte est celui que MariaDB renvoie.
BINARY, VARBINARY, BLOB
RAW jusqu'à 2000 octets, sinon BLOB
Les octets restent des octets.
PARTITION BY
une seule table
Les lignes sont les mêmes ; partitionnez à nouveau la table dans Oracle si besoin.
Ligne du rapport: partitions_dropped
WITH SYSTEM VERSIONING (MariaDB)
une table avec les lignes actuelles
Un dump ne contient que les lignes actuelles.
Ligne du rapport: system_versioning_dropped
MyISAM, MEMORY and other engines
une table ordinaire
Oracle a un seul moteur de tables.
Ligne du rapport: engine_dropped
views, triggers, procedures, functions and events
listés dans le rapport
Leur code est écrit dans le langage de MySQL ; ils sont donc listés pour que vous les recréiez.
Ligne du rapport: not_converted_objects
dumps without CREATE TABLE
types déduits des valeurs
Un dump fait avec --no-create-info ne contient que des lignes, donc les types viennent des valeurs.
Ligne du rapport: no_schema
geometries in a dump without CREATE TABLE
BLOB contenant du WKB
Le format de géométrie de MySQL est reconnu à partir des valeurs et stocké en WKB standard.
Ligne du rapport: geometry_inferred
_ci collations
comparaison exacte
Oracle compare le texte exactement, sauf indication contraire.
Ligne du rapport: case_insensitive_collation
SET NAMES utf8 from utf8mb4 tables
converti, avec un avertissement
Le mysqldump de MySQL 5.x écrit par défaut en utf8 sur 3 octets et remplace chaque emoji par un point d'interrogation avant qu'un convertisseur ne voie le fichier.
Ligne du rapport: dump_lost_four_byte_chars
dumps without SET NAMES whose text isn't UTF-8
lu comme Latin-1 (Windows-1252)
Le latin1 de MySQL est le Windows-1252, l'encodage habituel de ces dumps.
Ligne du rapport: charset_guessed
sjis, cp932, gbk, big5 dumps
lu comme UTF-8, avec un avertissement
Ces encodages ne sont pas encore décodés.
Ligne du rapport: unsupported_charset
UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows
évaluées
Certains outils de dump écrivent les valeurs sous forme de ces appels ; ils sont lus comme les valeurs qu'ils produisent, le WKT géographique étant remis avec la longitude en premier.
other expressions in rows
NULL
Un convertisseur qui n'exécute pas de base de données ne peut pas les évaluer.
Ligne du rapport: expression_value
DEFAULT in VALUES
la valeur par défaut de la colonne
Une valeur par défaut littérale est copiée dans la ligne.
Ligne du rapport: default_keyword_filled
DEFAULT in VALUES without a literal default
NULL
Il n'y a aucune valeur à copier.
Ligne du rapport: default_keyword_null
REPLACE and INSERT IGNORE
lignes simples
Un dump a une ligne par clé, donc les lignes sont les mêmes.
Ligne du rapport: replace_as_insert
types IntoSQL doesn't know
CLOB
Le texte contient n'importe quelle valeur ; changez le type après le chargement.
Ligne du rapport: unknown_type
values that don't fit their column
NULL
Un dump endommagé ou écrit à la main peut contenir des valeurs que sa colonne n'accepte pas ; elles deviennent NULL pour que le reste se charge.
Ligne du rapport: invalid_value_null
unreadable geometries
NULL
Des octets qui ne forment pas une géométrie ne peuvent pas être stockés comme telle.
Ligne du rapport: bad_geometry
dumps of several databases
un seul schéma, chaque table préfixée par le nom de sa base
Le script se charge dans le schéma de l'utilisateur qui l'exécute ; les tables de bases différentes reçoivent donc le nom de leur base en préfixe.
Ligne du rapport: databases_merged
CREATE SEQUENCE (MariaDB)
CREATE SEQUENCE, à la valeur atteinte
Les séquences Oracle fonctionnent de la même façon.
VECTOR(n) (MariaDB 11.7+)
CLOB avec les flottants en tableau JSON
Seul Oracle 23ai a un type vector ; un tableau JSON garde chaque flottant dans toutes les versions.
Ligne du rapport: type_replaced
| Dans MariaDB | Dans Oracle | Ligne du rapport |
|---|---|---|
| TINYINT(1), BOOL | NUMBER(1) avec un CHECK de 0 et 1 si chaque valeur vaut 0 ou 1, sinon NUMBER(3)Le BOOL de MySQL est un TINYINT(1) qui peut contenir tout nombre de -128 à 127. Oracle avant 23ai n'a pas de colonne booléenne, donc une colonne de 0 et 1 devient NUMBER(1) avec un CHECK ; une colonne qui contient 2 ou -1 garde ses nombres. | bool_kept_numeric |
| UNSIGNED integers | NUMBER assez large pour la plage, avec un CHECK qui interdit les négatifsLe NUMBER d'Oracle contient tout entier des largeurs de MySQL ; la contrainte CHECK écarte les valeurs négatives comme le faisait MySQL. | |
| ZEROFILL and display widths | suppriméLe remplissage par des zéros est une façon d'afficher un nombre, pas une partie du nombre. Les nombres sont conservés ; formatez-les à la lecture si le remplissage compte. | zerofill_dropped |
| FLOAT(M,D) | BINARY_FLOAT ou BINARY_DOUBLE, sans l'échelleLes flottants binaires d'Oracle n'ont pas d'échelle fixe. Les valeurs stockées sont copiées telles quelles. | float_scale_dropped |
| DECIMAL(p,s) | NUMBER(p,s) jusqu'à 38 chiffres ; VARCHAR2 au-delàLe NUMBER d'Oracle contient 38 chiffres. Les décimaux plus larges sont gardés en texte pour que chaque chiffre reste exact. | decimal_as_text |
| BIT(1), BIT(n) | NUMBER(1), NUMBER(19) jusqu'à 63 bits, NUMBER(20) pour BIT(64)Les champs de bits sont stockés comme le nombre que forment leurs bits. | |
| zero, partial or impossible dates (0000-00-00, 2024-02-30) | NULLOracle ne stocke que de vraies dates du calendrier. MySQL garde les dates zéro et impossibles quand son mode SQL les autorise ; elles deviennent NULL et le rapport les compte. | invalid_date_null |
| NOT NULL columns with values that become NULL | NOT NULL retiréUne colonne dont des valeurs ont dû devenir NULL, chaînes vides comprises, ne peut pas garder NOT NULL, sinon le chargement s'arrêterait. | not_null_relaxed |
| empty strings and empty binary values | NULLOracle stocke une chaîne vide comme NULL, donc une valeur qui valait ' se relit comme NULL. Le rapport les compte par colonne. | empty_string_null |
| DEFAULT '0000-00-00' | aucune valeur par défautUne valeur par défaut qu'Oracle ne peut pas stocker est omise plutôt que remplacée par une date inventée. | zero_date_default |
| TIME | INTERVAL DAY TO SECOND, qui contient des duréesOracle n'a pas de type heure du jour, et le TIME de MySQL est une durée de -838:59:59 à 838:59:59 ; un intervalle contient chaque valeur. | |
| YEAR | NUMBER(4) avec un CHECK de sa plageOracle n'a pas de type année ; le CHECK garde les mêmes valeurs que MySQL autorise. | |
| CHAR(n), VARCHAR(n) | VARCHAR2(n CHAR), en caractèresLes longueurs comptent les caractères comme celles de MySQL, et MySQL renvoie les valeurs CHAR sans espaces de fin, telles que VARCHAR2 les garde. | |
| VARCHAR(n) and TEXT longer than 4000 bytes | CLOBUn VARCHAR2 contient 4000 octets par défaut, donc un texte plus long devient un CLOB ; une colonne dont toutes les valeurs tiennent garde VARCHAR2. | text_as_lob |
| DATETIME | TIMESTAMPUn DATETIME est une date et une heure locales, sans fuseau horaire, comme TIMESTAMP. DATE devient le DATE d'Oracle, qui contient aussi une heure du jour, laissée à minuit. | |
| TIMESTAMP | TIMESTAMP WITH TIME ZONE dans le fuseau indiqué par le dump, UTC s'il n'en indique aucunUn TIMESTAMP est un instant. Les dumps indiquent le fuseau dans lequel ils l'ont écrit (mysqldump écrit en UTC) ; sinon, les valeurs sont lues en UTC et le rapport le signale. | timestamp_zone_assumed |
| ENUM | VARCHAR2 avec un CHECK de ses valeursUn texte avec une contrainte CHECK garde les mêmes valeurs. | |
| ENUM holding '' (MySQL's error value) | NULLMySQL stocke une chaîne vide quand une valeur invalide entre dans un ENUM avec un mode SQL permissif. Oracle la stocke comme NULL, ce que la contrainte CHECK autorise, et le rapport la compte avec les autres valeurs vides. | |
| ENUM holding values outside its list | pas de CHECKLes valeurs absentes de la liste feraient échouer la contrainte CHECK, qui n'est donc pas créée. | enum_check_skipped |
| SET | VARCHAR2 tel que MySQL l'écrit ('a,b')Oracle n'a pas de type ensemble ; le texte est celui que MySQL renvoie. | |
| JSON | CLOBLes fonctions JSON d'Oracle lisent le JSON depuis du texte sur chaque version, et un CLOB garde des valeurs de toute taille. | |
| NUL bytes in text | conservéVARCHAR2 et CLOB peuvent contenir un caractère NUL, donc la valeur est copiée telle quelle. | |
| text that isn't valid in its character set | les octets invalides deviennent le caractère de remplacementLe texte doit être lu comme des caractères pour être écrit en VARCHAR2. | invalid_utf8_replaced |
| text decoded twice (ñ) | copié tel quelLe dump contient exactement ces caractères, ils sont donc copiés ; le rapport les signale. | mojibake_suspected |
| AUTO_INCREMENT | GENERATED BY DEFAULT ON NULL AS IDENTITY, redémarré après les identifiants copiésLes identifiants copiés se chargent tels quels, et le compteur reprend après le plus élevé ou après l'AUTO_INCREMENT du dump, selon le plus grand. | |
| MyISAM AUTO_INCREMENT on the second column of a key | un seul compteur pour la tableMyISAM compte par groupe de la première colonne de la clé ; Oracle a un compteur par table. | myisam_group_autoincrement |
| ON UPDATE CURRENT_TIMESTAMP | un déclencheur BEFORE UPDATELe déclencheur met la colonne à l'heure actuelle quand une mise à jour ne la définit pas. | on_update_trigger |
| generated columns | colonnes virtuellesOracle ne calcule les colonnes générées qu'à la lecture ; les colonnes STORED deviennent virtuelles avec les mêmes valeurs. | stored_as_virtual |
| generated columns with functions Oracle lacks | une colonne simpleUne formule qui ne peut pas être écrite pour Oracle laisse une colonne simple et une ligne dans le rapport. | generated_not_translated |
| INVISIBLE columns | colonnes INVISIBLEOracle cache les colonnes invisibles de SELECT * comme le fait MySQL. | |
| CHECK constraints | traduites, en ligne dans CREATE TABLELes CHECK en ligne sont vérifiés au chargement de chaque ligne. | |
| CHECK constraints with functions Oracle lacks | non crééeUne contrainte CHECK qui ne peut pas être écrite pour Oracle est omise et signalée. | check_skipped |
| CHECK ... NOT ENFORCED | non crééeMySQL garde ces contraintes CHECK sans les appliquer, donc les lignes peuvent les enfreindre. | check_not_enforced |
| defaults with functions Oracle lacks | aucune valeur par défautUne valeur par défaut qui ne peut pas être écrite pour Oracle est omise et signalée. | default_not_translated |
| keys and indexes on a prefix, c(20) | un index sur SUBSTR de la colonneUn index de fonction sur le même début de la colonne distingue les mêmes lignes, et indexe les colonnes CLOB qu'Oracle ne peut pas indexer en entier. | prefix_unique |
| FULLTEXT indexes | non crééeOracle Text gère la recherche plein texte avec son propre type d'index et ses propres requêtes. | fulltext_not_created |
| SPATIAL indexes | non crééeLes géométries sont stockées en octets WKB, qu'un index spatial ne sait pas lire. | spatial_index_not_created |
| functional indexes, and indexes on whole CLOB or BLOB columns | non crééOracle ne peut pas indexer un objet volumineux en entier, et certaines fonctions MySQL n'ont pas d'équivalent Oracle. | index_skipped |
| foreign keys | après les données ENABLE NOVALIDATE, puis validée avec un avertissement sur les orphelinsLes dumps se chargent avec FOREIGN_KEY_CHECKS=0 et MyISAM ne vérifie jamais, donc les lignes sans parent sont fréquentes. La clé vérifie tout de suite les nouvelles lignes et est validée en dernier ; des orphelins la laissent non validée avec un avertissement au lieu d'arrêter le chargement. | |
| ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT | suppriméLes clés étrangères d'Oracle n'agissent qu'à la suppression, avec CASCADE ou SET NULL. | foreign_key_action_unsupported |
| foreign keys to columns without a unique key | non crééeOracle exige une clé primaire ou une contrainte unique sur les colonnes référencées ; InnoDB non. | foreign_key_skipped |
| table and column names | en majuscules pour les noms simples, sinon tels qu'écritsOracle stocke en majuscules les noms écrits sans guillemets ; les noms simples passent donc en majuscules et les requêtes peuvent omettre les guillemets. Les autres noms gardent leur casse et exigent des guillemets. | identifier_renamed |
| names over 128 bytes | raccourciDepuis Oracle 12.2, les noms font 128 octets au plus. | name_shortened |
| GEOMETRY, POINT, POLYGON... | BLOB contenant du WKBWKB est la forme standard que lit chaque bibliothèque spatiale ; SDO_GEOMETRY exige les métadonnées d'Oracle Spatial. | geometry_as_blob |
| INET4, INET6, UUID (MariaDB) | VARCHAR2(39), VARCHAR2(36)Oracle n'a aucun de ces types ; le texte est celui que MariaDB renvoie. | |
| BINARY, VARBINARY, BLOB | RAW jusqu'à 2000 octets, sinon BLOBLes octets restent des octets. | |
| PARTITION BY | une seule tableLes lignes sont les mêmes ; partitionnez à nouveau la table dans Oracle si besoin. | partitions_dropped |
| WITH SYSTEM VERSIONING (MariaDB) | une table avec les lignes actuellesUn dump ne contient que les lignes actuelles. | system_versioning_dropped |
| MyISAM, MEMORY and other engines | une table ordinaireOracle a un seul moteur de tables. | engine_dropped |
| views, triggers, procedures, functions and events | listés dans le rapportLeur code est écrit dans le langage de MySQL ; ils sont donc listés pour que vous les recréiez. | not_converted_objects |
| dumps without CREATE TABLE | types déduits des valeursUn dump fait avec --no-create-info ne contient que des lignes, donc les types viennent des valeurs. | no_schema |
| geometries in a dump without CREATE TABLE | BLOB contenant du WKBLe format de géométrie de MySQL est reconnu à partir des valeurs et stocké en WKB standard. | geometry_inferred |
| _ci collations | comparaison exacteOracle compare le texte exactement, sauf indication contraire. | case_insensitive_collation |
| SET NAMES utf8 from utf8mb4 tables | converti, avec un avertissementLe mysqldump de MySQL 5.x écrit par défaut en utf8 sur 3 octets et remplace chaque emoji par un point d'interrogation avant qu'un convertisseur ne voie le fichier. | dump_lost_four_byte_chars |
| dumps without SET NAMES whose text isn't UTF-8 | lu comme Latin-1 (Windows-1252)Le latin1 de MySQL est le Windows-1252, l'encodage habituel de ces dumps. | charset_guessed |
| sjis, cp932, gbk, big5 dumps | lu comme UTF-8, avec un avertissementCes encodages ne sont pas encore décodés. | unsupported_charset |
| UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows | évaluéesCertains outils de dump écrivent les valeurs sous forme de ces appels ; ils sont lus comme les valeurs qu'ils produisent, le WKT géographique étant remis avec la longitude en premier. | |
| other expressions in rows | NULLUn convertisseur qui n'exécute pas de base de données ne peut pas les évaluer. | expression_value |
| DEFAULT in VALUES | la valeur par défaut de la colonneUne valeur par défaut littérale est copiée dans la ligne. | default_keyword_filled |
| DEFAULT in VALUES without a literal default | NULLIl n'y a aucune valeur à copier. | default_keyword_null |
| REPLACE and INSERT IGNORE | lignes simplesUn dump a une ligne par clé, donc les lignes sont les mêmes. | replace_as_insert |
| types IntoSQL doesn't know | CLOBLe texte contient n'importe quelle valeur ; changez le type après le chargement. | unknown_type |
| values that don't fit their column | NULLUn dump endommagé ou écrit à la main peut contenir des valeurs que sa colonne n'accepte pas ; elles deviennent NULL pour que le reste se charge. | invalid_value_null |
| unreadable geometries | NULLDes octets qui ne forment pas une géométrie ne peuvent pas être stockés comme telle. | bad_geometry |
| dumps of several databases | un seul schéma, chaque table préfixée par le nom de sa baseLe script se charge dans le schéma de l'utilisateur qui l'exécute ; les tables de bases différentes reçoivent donc le nom de leur base en préfixe. | databases_merged |
| CREATE SEQUENCE (MariaDB) | CREATE SEQUENCE, à la valeur atteinteLes séquences Oracle fonctionnent de la même façon. | |
| VECTOR(n) (MariaDB 11.7+) | CLOB avec les flottants en tableau JSONSeul Oracle 23ai a un type vector ; un tableau JSON garde chaque flottant dans toutes les versions. | type_replaced |
Charger le script dans Oracle
Le script crée les tables, copie les lignes, puis ajoute les clés, les index et les clés étrangères ; il se charge donc vite et s'arrête à la première erreur.
NLS_LANG=.AL32UTF8 sqlplus -S -L user@//localhost/mydb @mariadb.oracle.sqlLes clés étrangères sont ajoutées ENABLE NOVALIDATE, donc les nouvelles lignes sont vérifiées tout de suite, puis validées. Si une ancienne ligne pointe vers une ligne qui n'existe pas, le script indique quelle contrainte et la laisse non validée, au lieu d'échouer à mi-chemin.
Pour un gros dump, exécutez SQL*Plus sur la machine de la base de données. Le script valide toutes les 100 lignes. L'utilisateur qui l'exécute a besoin de CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER et CREATE PROCEDURE, et d'un quota sur son tablespace.
Faire le dump MariaDB pour un meilleur résultat
Le convertisseur lit ce que contient le dump. Ces options y gardent davantage de vos données :
- --default-character-set=utf8mb4 garde les emoji et autres caractères sur 4 octets, qu'un dump utf8mb3 perd avant que le convertisseur ne le voie.
- --hex-blob écrit les colonnes binaires et les valeurs VECTOR en hexadécimal, ce qui résiste aux copies entre systèmes.
- --routines --triggers --events ajoutent ces objets au dump, pour que le rapport puisse les lister.
Ce qui n'est pas converti
Les vues, déclencheurs, procédures stockées, fonctions et événements sont écrits dans le langage propre à MariaDB. Ils sont listés par nom dans le rapport, jamais supprimés en silence, pour que vous puissiez les réécrire pour Oracle.
Questions sur MariaDB vers Oracle
Pas de réponse ici ? Écrivez-nous depuis la page de contact, une personne vous répond. Page de contact
Mon dump est-il envoyé ?
Non. Le convertisseur s'exécute dans votre navigateur et lit le dump depuis votre disque par morceaux ; il ne quitte donc jamais votre ordinateur. L'application de bureau et la ligne de commande convertissent aussi sur votre ordinateur.
Quelle taille peut avoir le dump ?
Le convertisseur ne garde jamais tout le dump en mémoire : il lit le fichier deux fois, par plages, et écrit le script au fur et à mesure. Les dumps de plusieurs gigaoctets se convertissent dans le navigateur, dans l'application de bureau et avec la ligne de commande.
De quelles versions de MariaDB le dump peut-il venir ?
Les dumps de mariadb-dump et mysqldump sur MariaDB 10.3 à 12, avec un INSERT par table ou un par ligne. Chaque dump de test vient de MariaDB 10.11, 11.4 et 11.8 et est comparé à sa source cellule par cellule.
Les colonnes UUID, INET6, JSON et VECTOR sont-elles conservées ?
Les colonnes UUID et INET deviennent VARCHAR2, JSON CLOB, et VECTOR un tableau JSON de ses flottants. Les dates zéro deviennent NULL, tout comme les chaînes vides, car Oracle les stocke ainsi.
Les valeurs AUTO_INCREMENT et les séquences sont-elles conservées ?
Oui. Chaque colonne AUTO_INCREMENT devient une colonne d'identité qui reprend après l'identifiant le plus élevé. Les séquences deviennent des séquences Oracle, et les valeurs par défaut qui puisent dans une séquence continuent d'y puiser.
Et les procédures stockées et les déclencheurs ?
Ils sont listés par nom dans le rapport et ne sont pas convertis, car chaque base de données les écrit dans son propre langage.
Sur quelles versions de Oracle le script se charge-t-il ?
Oracle 19c et versions ultérieures. Chaque dump de test se charge sur 21c et 23ai, et s'arrête à la première erreur en cas de problème.