Konwertuj MariaDB do Oracle
Upuść zrzut z mariadb-dump, mysqldump, phpMyAdmin lub Adminer jako .sql lub .sql.gz i pobierz skrypt Oracle z tymi samymi tabelami, kluczami, indeksami i danymi. Każda wartość, której Oracle nie może przechować bez zmian, i każdy obiekt, którego nie przenosi, są wymienione w raporcie.
18 wierszy przekonwertowanych, 4 poprawki, brak odrzuconych
Tabele w pliku shop_2024_mariadb.sqlZrzut MariaDB 11.8.9-MariaDB-ubu2404 · zapisany przez mariadb-dump · utf8mb4
customerszapisana jako CUSTOMERS8 wierszy2
8 kolumn 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) orderszapisana jako ORDERS10 wierszy2
12 kolumn 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;
Poprawki
- "signed_up" w tabeli customers dopuszcza teraz NULL: części jej wartości nie dało się zapisać i są NULL.
- Wartość domyślna "signed_up" w tabeli customers, 0000‑00‑00, nie jest datą akceptowaną przez Oracle, więc kolumna nie ma wartości domyślnej.
- "status" w tabeli orders dopuszcza teraz NULL: części jej wartości nie dało się zapisać i są NULL.
- "updated_at" w tabeli orders zmienia się na bieżący czas przy każdej aktualizacji; w Oracle robi to wyzwalacz.
Do sprawdzenia
- W "signed_up" tabeli customers zamieniono na NULL 1 wartość z zerową lub niemożliwą datą, np. 0000‑00‑00, bo Oracle nie zapisuje takich dat. Jeśli te daty coś znaczą, zastąp je w źródle prawdziwymi, zanim zrobisz zrzut.
- W "shipped_at" tabeli orders zamieniono na NULL 1 wartość z zerową lub niemożliwą datą, np. 0000‑00‑00 00:00:00, bo Oracle nie zapisuje takich dat. Jeśli te daty coś znaczą, zastąp je w źródle prawdziwymi, zanim zrobisz zrzut.
- W "status" tabeli orders zamieniono na NULL 1 pustą wartość; Oracle zapisuje pusty ciąg jako NULL. Tam, gdzie zapytania porównują tę kolumnę z ', porównuj z IS NULL.
Plik jest konwertowany na tym komputerze i nigdy nie jest wysyłany.
Inne przykłady:
Co zmienia się między MariaDB a Oracle
Każdy wiersz to reguła stosowana przez konwerter, z wpisem, który dodaje do raportu, gdy reguła coś zmienia w twoich danych.
TINYINT(1), BOOL
NUMBER(1) z CHECK 0 i 1, gdy każda wartość to 0 lub 1, w przeciwnym razie NUMBER(3)
BOOL w MySQL to TINYINT(1), który mieści dowolną liczbę od -128 do 127. Oracle przed 23ai nie ma kolumny logicznej, więc kolumna z 0 i 1 to NUMBER(1) z ograniczeniem CHECK; kolumna z 2 lub -1 zachowuje swoje liczby.
Wpis w raporcie: bool_kept_numeric
UNSIGNED integers
NUMBER wystarczająco szeroki dla zakresu, z CHECK, że wartość nie jest ujemna
NUMBER w Oracle mieści każdą liczbę całkowitą o szerokościach, jakie ma MySQL; ograniczenie CHECK blokuje wartości ujemne, tak jak MySQL.
ZEROFILL and display widths
usunięte
Dopełnienie zerami to sposób wyświetlania liczby, a nie jej część. Liczby zostają zachowane; jeśli dopełnienie jest ważne, formatuj je przy odczycie.
Wpis w raporcie: zerofill_dropped
FLOAT(M,D)
BINARY_FLOAT lub BINARY_DOUBLE, bez skali
Binarne liczby zmiennoprzecinkowe w Oracle nie mają stałej skali. Zapisane wartości są kopiowane bez zmian.
Wpis w raporcie: float_scale_dropped
DECIMAL(p,s)
NUMBER(p,s) do 38 cyfr; powyżej VARCHAR2
NUMBER w Oracle mieści 38 cyfr. Szersze liczby dziesiętne są zapisywane jako tekst, aby każda cyfra pozostała dokładna.
Wpis w raporcie: decimal_as_text
BIT(1), BIT(n)
NUMBER(1), NUMBER(19) do 63 bitów, NUMBER(20) dla BIT(64)
Pola bitowe są zapisywane jako liczba, którą tworzą ich bity.
zero, partial or impossible dates (0000-00-00, 2024-02-30)
NULL
Oracle przechowuje tylko prawdziwe daty kalendarzowe. MySQL zachowuje daty zerowe i niemożliwe, gdy pozwala na to tryb SQL; stają się NULL, a raport je liczy.
Wpis w raporcie: invalid_date_null
NOT NULL columns with values that become NULL
NOT NULL usunięte
Kolumna, której wartości musiały stać się NULL, łącznie z pustymi ciągami, nie może zachować NOT NULL, bo ładowanie by się zatrzymało.
Wpis w raporcie: not_null_relaxed
empty strings and empty binary values
NULL
Oracle zapisuje pusty ciąg jako NULL, więc wartość ' jest odczytywana jako NULL. Raport liczy je w każdej kolumnie.
Wpis w raporcie: empty_string_null
DEFAULT '0000-00-00'
brak wartości domyślnej
Wartość domyślna, której Oracle nie może zapisać, jest pomijana, a nie zastępowana zmyśloną datą.
Wpis w raporcie: zero_date_default
TIME
INTERVAL DAY TO SECOND, który mieści czasy trwania
Oracle nie ma typu godziny dnia, a TIME w MySQL to czas trwania od -838:59:59 do 838:59:59; interwał mieści każdą wartość.
YEAR
NUMBER(4) z CHECK zakresu
Oracle nie ma typu roku; ograniczenie CHECK zachowuje te same wartości, na które pozwala MySQL.
CHAR(n), VARCHAR(n)
VARCHAR2(n CHAR), liczony w znakach
Długości liczą znaki, tak jak w MySQL, a MySQL zwraca wartości CHAR bez końcowych spacji, tak jak zachowuje je VARCHAR2.
VARCHAR(n) and TEXT longer than 4000 bytes
CLOB
VARCHAR2 mieści domyślnie 4000 bajtów, więc dłuższy tekst to CLOB; kolumna, której wszystkie wartości się mieszczą, zachowuje VARCHAR2.
Wpis w raporcie: text_as_lob
DATETIME
TIMESTAMP
DATETIME to wskazanie zegara bez strefy czasowej, jak TIMESTAMP. DATE staje się DATE w Oracle, który zawiera też godzinę, ustawioną na północ.
TIMESTAMP
TIMESTAMP WITH TIME ZONE w strefie podanej w zrzucie, UTC, gdy jej nie podaje
TIMESTAMP to moment w czasie. Zrzuty podają strefę, w której go zapisały (mysqldump zapisuje UTC); bez niej wartości są odczytywane jako UTC, a raport o tym mówi.
Wpis w raporcie: timestamp_zone_assumed
ENUM
VARCHAR2 z CHECK dozwolonych wartości
Tekst z ograniczeniem CHECK zachowuje te same wartości.
ENUM holding '' (MySQL's error value)
NULL
MySQL zapisuje pusty ciąg, gdy w łagodnym trybie SQL do ENUM trafia błędna wartość. Oracle zapisuje go jako NULL, co ograniczenie CHECK dopuszcza, a raport liczy go razem z innymi pustymi wartościami.
ENUM holding values outside its list
bez CHECK
Wartości spoza listy nie przeszłyby ograniczenia CHECK, więc nie jest ono tworzone.
Wpis w raporcie: enum_check_skipped
SET
VARCHAR2 w zapisie MySQL ('a,b')
Oracle nie ma typu zbioru; tekst jest taki, jaki zwraca MySQL.
JSON
CLOB
Funkcje JSON w Oracle odczytują JSON z tekstu w każdej wersji, a CLOB mieści wartości dowolnego rozmiaru.
NUL bytes in text
zachowane
VARCHAR2 i CLOB mogą zawierać znak NUL, więc wartość jest kopiowana bez zmian.
text that isn't valid in its character set
błędne bajty jako znak zastępczy
Tekst trzeba odczytać jako znaki, aby zapisać go jako VARCHAR2.
Wpis w raporcie: invalid_utf8_replaced
text decoded twice (ñ)
skopiowane bez zmian
Zrzut zawiera dokładnie te znaki, więc są kopiowane; raport je wskazuje.
Wpis w raporcie: mojibake_suspected
AUTO_INCREMENT
GENERATED BY DEFAULT ON NULL AS IDENTITY, wznowione za skopiowanymi id
Skopiowane id ładują się bez zmian, a licznik idzie dalej od najwyższego z nich lub od AUTO_INCREMENT ze zrzutu, zależnie od tego, która wartość jest wyższa.
MyISAM AUTO_INCREMENT on the second column of a key
jeden licznik dla tabeli
MyISAM liczy osobno w każdej grupie pierwszej kolumny klucza; Oracle ma jeden licznik na tabelę.
Wpis w raporcie: myisam_group_autoincrement
ON UPDATE CURRENT_TIMESTAMP
wyzwalacz BEFORE UPDATE
Wyzwalacz ustawia kolumnę na bieżący czas, gdy aktualizacja jej nie ustawia.
Wpis w raporcie: on_update_trigger
generated columns
kolumny wirtualne
Oracle oblicza kolumny generowane tylko przy odczycie; kolumny STORED stają się wirtualne z tymi samymi wartościami.
Wpis w raporcie: stored_as_virtual
generated columns with functions Oracle lacks
zwykła kolumna
Formuła, której nie da się zapisać dla Oracle, zostawia zwykłą kolumnę i wpis w raporcie.
Wpis w raporcie: generated_not_translated
INVISIBLE columns
kolumny INVISIBLE
Oracle ukrywa niewidoczne kolumny przed SELECT *, tak jak MySQL.
CHECK constraints
przetłumaczone, wewnątrz CREATE TABLE
CHECK w definicji tabeli działa przy ładowaniu każdego wiersza.
CHECK constraints with functions Oracle lacks
nie jest tworzone
Ograniczenie CHECK, którego nie da się zapisać dla Oracle, jest pomijane i zgłaszane w raporcie.
Wpis w raporcie: check_skipped
CHECK ... NOT ENFORCED
nie jest tworzone
MySQL przechowuje te ograniczenia bez ich stosowania, więc wiersze mogą je łamać.
Wpis w raporcie: check_not_enforced
defaults with functions Oracle lacks
brak wartości domyślnej
Wartość domyślna, której nie da się zapisać dla Oracle, jest pomijana i zgłaszana w raporcie.
Wpis w raporcie: default_not_translated
keys and indexes on a prefix, c(20)
indeks na SUBSTR kolumny
Indeks funkcyjny na tym samym początku kolumny odróżnia te same wiersze i indeksuje kolumny CLOB, których Oracle nie indeksuje w całości.
Wpis w raporcie: prefix_unique
FULLTEXT indexes
nie jest tworzone
Oracle Text buduje wyszukiwanie pełnotekstowe z własnym typem indeksu i zapytaniami.
Wpis w raporcie: fulltext_not_created
SPATIAL indexes
nie jest tworzone
Geometrie są zapisywane jako bajty WKB, których indeks przestrzenny nie odczyta.
Wpis w raporcie: spatial_index_not_created
functional indexes, and indexes on whole CLOB or BLOB columns
nie jest tworzony
Oracle nie indeksuje dużego obiektu w całości, a niektóre funkcje MySQL nie mają odpowiednika w Oracle.
Wpis w raporcie: index_skipped
foreign keys
po danych z ENABLE NOVALIDATE, potem walidowany z ostrzeżeniem o osieroconych wierszach
Zrzuty ładują się z FOREIGN_KEY_CHECKS=0, a MyISAM nigdy nie sprawdza kluczy, więc wiersze bez rodzica są częste. Klucz od razu sprawdza nowe wiersze i jest walidowany na końcu; osierocone wiersze zostawiają go niezwalidowanym z ostrzeżeniem, zamiast zatrzymać ładowanie.
ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT
usunięte
Klucze obce w Oracle działają tylko przy usuwaniu, z CASCADE lub SET NULL.
Wpis w raporcie: foreign_key_action_unsupported
foreign keys to columns without a unique key
nie jest tworzony
Oracle wymaga klucza głównego lub ograniczenia unikalności na kolumnach, do których się odwołuje; InnoDB nie.
Wpis w raporcie: foreign_key_skipped
table and column names
wielkie litery dla zwykłych nazw, inne jak w źródle
Oracle zapisuje nazwy bez cudzysłowów wielkimi literami, więc zwykłe nazwy stają się wielkimi literami, a zapytania mogą pominąć cudzysłowy; inne nazwy zachowują wielkość liter i wymagają cudzysłowów.
Wpis w raporcie: identifier_renamed
names over 128 bytes
skrócone
Nazwy w Oracle 12.2 i nowszym mają do 128 bajtów.
Wpis w raporcie: name_shortened
GEOMETRY, POINT, POLYGON...
BLOB z WKB
WKB to standardowy format, który czyta każda biblioteka przestrzenna; SDO_GEOMETRY wymaga metadanych Oracle Spatial.
Wpis w raporcie: geometry_as_blob
INET4, INET6, UUID (MariaDB)
VARCHAR2(39), VARCHAR2(36)
Oracle nie ma żadnego z tych typów; tekst jest taki, jaki zwraca MariaDB.
BINARY, VARBINARY, BLOB
RAW do 2000 bajtów, w przeciwnym razie BLOB
Bajty pozostają bajtami.
PARTITION BY
jedna tabela
Wiersze są te same; jeśli trzeba, podziel tabelę na partycje ponownie w Oracle.
Wpis w raporcie: partitions_dropped
WITH SYSTEM VERSIONING (MariaDB)
tabela z bieżącymi wierszami
Zrzut zawiera tylko bieżące wiersze.
Wpis w raporcie: system_versioning_dropped
MyISAM, MEMORY and other engines
zwykła tabela
Oracle ma jeden silnik tabel.
Wpis w raporcie: engine_dropped
views, triggers, procedures, functions and events
wymienione w raporcie
Ich kod jest napisany w języku MySQL, więc trafiają na listę do ręcznego odtworzenia.
Wpis w raporcie: not_converted_objects
dumps without CREATE TABLE
typy odczytane z wartości
Zrzut zrobiony z --no-create-info zawiera tylko wiersze, więc typy pochodzą z wartości.
Wpis w raporcie: no_schema
geometries in a dump without CREATE TABLE
BLOB z WKB
Format geometrii MySQL jest rozpoznawany po wartościach i zapisywany jako standardowe WKB.
Wpis w raporcie: geometry_inferred
_ci collations
dokładne porównanie
Oracle porównuje tekst dokładnie, chyba że ustawisz inaczej.
Wpis w raporcie: case_insensitive_collation
SET NAMES utf8 from utf8mb4 tables
przekonwertowane, z ostrzeżeniem
mysqldump z MySQL 5.x domyślnie zapisuje 3-bajtowe utf8 i zastępuje każde emoji znakiem zapytania, zanim jakikolwiek konwerter zobaczy plik.
Wpis w raporcie: dump_lost_four_byte_chars
dumps without SET NAMES whose text isn't UTF-8
odczytane jako Latin-1 (Windows-1252)
latin1 w MySQL to Windows-1252, zwykłe kodowanie takich zrzutów.
Wpis w raporcie: charset_guessed
sjis, cp932, gbk, big5 dumps
odczytane jako UTF-8, z ostrzeżeniem
Te kodowania nie są jeszcze dekodowane.
Wpis w raporcie: unsupported_charset
UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows
obliczone
Niektóre narzędzia do zrzutów zapisują wartości jako takie wywołania; są odczytywane jako wartości, które zwracają, przy czym w geograficznym WKT najpierw jest długość geograficzna.
other expressions in rows
NULL
Konwerter, który nie uruchamia bazy danych, nie może ich obliczyć.
Wpis w raporcie: expression_value
DEFAULT in VALUES
wartość domyślna kolumny
Dosłowna wartość domyślna jest kopiowana do wiersza.
Wpis w raporcie: default_keyword_filled
DEFAULT in VALUES without a literal default
NULL
Nie ma wartości do skopiowania.
Wpis w raporcie: default_keyword_null
REPLACE and INSERT IGNORE
zwykłe wiersze
Zrzut ma jeden wiersz na klucz, więc wiersze są te same.
Wpis w raporcie: replace_as_insert
types IntoSQL doesn't know
CLOB
Tekst mieści każdą wartość; zmień typ po załadowaniu.
Wpis w raporcie: unknown_type
values that don't fit their column
NULL
Uszkodzony lub ręcznie pisany zrzut może zawierać wartości, których kolumna nie przyjmie; stają się NULL, aby reszta się załadowała.
Wpis w raporcie: invalid_value_null
unreadable geometries
NULL
Bajtów, które nie są geometrią, nie da się zapisać jako geometrii.
Wpis w raporcie: bad_geometry
dumps of several databases
jeden schemat, nazwa każdej tabeli zaczyna się od nazwy jej bazy
Skrypt ładuje się do schematu użytkownika, który go uruchamia, więc tabele z różnych baz danych dostają na początku nazwę swojej bazy.
Wpis w raporcie: databases_merged
CREATE SEQUENCE (MariaDB)
CREATE SEQUENCE, od osiągniętej wartości
Sekwencje w Oracle działają tak samo.
VECTOR(n) (MariaDB 11.7+)
CLOB z liczbami float jako tablicą JSON
Tylko Oracle 23ai ma typ wektorowy; tablica JSON zachowuje każdą liczbę float w każdej wersji.
Wpis w raporcie: type_replaced
| W MariaDB | W Oracle | Wpis w raporcie |
|---|---|---|
| TINYINT(1), BOOL | NUMBER(1) z CHECK 0 i 1, gdy każda wartość to 0 lub 1, w przeciwnym razie NUMBER(3)BOOL w MySQL to TINYINT(1), który mieści dowolną liczbę od -128 do 127. Oracle przed 23ai nie ma kolumny logicznej, więc kolumna z 0 i 1 to NUMBER(1) z ograniczeniem CHECK; kolumna z 2 lub -1 zachowuje swoje liczby. | bool_kept_numeric |
| UNSIGNED integers | NUMBER wystarczająco szeroki dla zakresu, z CHECK, że wartość nie jest ujemnaNUMBER w Oracle mieści każdą liczbę całkowitą o szerokościach, jakie ma MySQL; ograniczenie CHECK blokuje wartości ujemne, tak jak MySQL. | |
| ZEROFILL and display widths | usunięteDopełnienie zerami to sposób wyświetlania liczby, a nie jej część. Liczby zostają zachowane; jeśli dopełnienie jest ważne, formatuj je przy odczycie. | zerofill_dropped |
| FLOAT(M,D) | BINARY_FLOAT lub BINARY_DOUBLE, bez skaliBinarne liczby zmiennoprzecinkowe w Oracle nie mają stałej skali. Zapisane wartości są kopiowane bez zmian. | float_scale_dropped |
| DECIMAL(p,s) | NUMBER(p,s) do 38 cyfr; powyżej VARCHAR2NUMBER w Oracle mieści 38 cyfr. Szersze liczby dziesiętne są zapisywane jako tekst, aby każda cyfra pozostała dokładna. | decimal_as_text |
| BIT(1), BIT(n) | NUMBER(1), NUMBER(19) do 63 bitów, NUMBER(20) dla BIT(64)Pola bitowe są zapisywane jako liczba, którą tworzą ich bity. | |
| zero, partial or impossible dates (0000-00-00, 2024-02-30) | NULLOracle przechowuje tylko prawdziwe daty kalendarzowe. MySQL zachowuje daty zerowe i niemożliwe, gdy pozwala na to tryb SQL; stają się NULL, a raport je liczy. | invalid_date_null |
| NOT NULL columns with values that become NULL | NOT NULL usunięteKolumna, której wartości musiały stać się NULL, łącznie z pustymi ciągami, nie może zachować NOT NULL, bo ładowanie by się zatrzymało. | not_null_relaxed |
| empty strings and empty binary values | NULLOracle zapisuje pusty ciąg jako NULL, więc wartość ' jest odczytywana jako NULL. Raport liczy je w każdej kolumnie. | empty_string_null |
| DEFAULT '0000-00-00' | brak wartości domyślnejWartość domyślna, której Oracle nie może zapisać, jest pomijana, a nie zastępowana zmyśloną datą. | zero_date_default |
| TIME | INTERVAL DAY TO SECOND, który mieści czasy trwaniaOracle nie ma typu godziny dnia, a TIME w MySQL to czas trwania od -838:59:59 do 838:59:59; interwał mieści każdą wartość. | |
| YEAR | NUMBER(4) z CHECK zakresuOracle nie ma typu roku; ograniczenie CHECK zachowuje te same wartości, na które pozwala MySQL. | |
| CHAR(n), VARCHAR(n) | VARCHAR2(n CHAR), liczony w znakachDługości liczą znaki, tak jak w MySQL, a MySQL zwraca wartości CHAR bez końcowych spacji, tak jak zachowuje je VARCHAR2. | |
| VARCHAR(n) and TEXT longer than 4000 bytes | CLOBVARCHAR2 mieści domyślnie 4000 bajtów, więc dłuższy tekst to CLOB; kolumna, której wszystkie wartości się mieszczą, zachowuje VARCHAR2. | text_as_lob |
| DATETIME | TIMESTAMPDATETIME to wskazanie zegara bez strefy czasowej, jak TIMESTAMP. DATE staje się DATE w Oracle, który zawiera też godzinę, ustawioną na północ. | |
| TIMESTAMP | TIMESTAMP WITH TIME ZONE w strefie podanej w zrzucie, UTC, gdy jej nie podajeTIMESTAMP to moment w czasie. Zrzuty podają strefę, w której go zapisały (mysqldump zapisuje UTC); bez niej wartości są odczytywane jako UTC, a raport o tym mówi. | timestamp_zone_assumed |
| ENUM | VARCHAR2 z CHECK dozwolonych wartościTekst z ograniczeniem CHECK zachowuje te same wartości. | |
| ENUM holding '' (MySQL's error value) | NULLMySQL zapisuje pusty ciąg, gdy w łagodnym trybie SQL do ENUM trafia błędna wartość. Oracle zapisuje go jako NULL, co ograniczenie CHECK dopuszcza, a raport liczy go razem z innymi pustymi wartościami. | |
| ENUM holding values outside its list | bez CHECKWartości spoza listy nie przeszłyby ograniczenia CHECK, więc nie jest ono tworzone. | enum_check_skipped |
| SET | VARCHAR2 w zapisie MySQL ('a,b')Oracle nie ma typu zbioru; tekst jest taki, jaki zwraca MySQL. | |
| JSON | CLOBFunkcje JSON w Oracle odczytują JSON z tekstu w każdej wersji, a CLOB mieści wartości dowolnego rozmiaru. | |
| NUL bytes in text | zachowaneVARCHAR2 i CLOB mogą zawierać znak NUL, więc wartość jest kopiowana bez zmian. | |
| text that isn't valid in its character set | błędne bajty jako znak zastępczyTekst trzeba odczytać jako znaki, aby zapisać go jako VARCHAR2. | invalid_utf8_replaced |
| text decoded twice (ñ) | skopiowane bez zmianZrzut zawiera dokładnie te znaki, więc są kopiowane; raport je wskazuje. | mojibake_suspected |
| AUTO_INCREMENT | GENERATED BY DEFAULT ON NULL AS IDENTITY, wznowione za skopiowanymi idSkopiowane id ładują się bez zmian, a licznik idzie dalej od najwyższego z nich lub od AUTO_INCREMENT ze zrzutu, zależnie od tego, która wartość jest wyższa. | |
| MyISAM AUTO_INCREMENT on the second column of a key | jeden licznik dla tabeliMyISAM liczy osobno w każdej grupie pierwszej kolumny klucza; Oracle ma jeden licznik na tabelę. | myisam_group_autoincrement |
| ON UPDATE CURRENT_TIMESTAMP | wyzwalacz BEFORE UPDATEWyzwalacz ustawia kolumnę na bieżący czas, gdy aktualizacja jej nie ustawia. | on_update_trigger |
| generated columns | kolumny wirtualneOracle oblicza kolumny generowane tylko przy odczycie; kolumny STORED stają się wirtualne z tymi samymi wartościami. | stored_as_virtual |
| generated columns with functions Oracle lacks | zwykła kolumnaFormuła, której nie da się zapisać dla Oracle, zostawia zwykłą kolumnę i wpis w raporcie. | generated_not_translated |
| INVISIBLE columns | kolumny INVISIBLEOracle ukrywa niewidoczne kolumny przed SELECT *, tak jak MySQL. | |
| CHECK constraints | przetłumaczone, wewnątrz CREATE TABLECHECK w definicji tabeli działa przy ładowaniu każdego wiersza. | |
| CHECK constraints with functions Oracle lacks | nie jest tworzoneOgraniczenie CHECK, którego nie da się zapisać dla Oracle, jest pomijane i zgłaszane w raporcie. | check_skipped |
| CHECK ... NOT ENFORCED | nie jest tworzoneMySQL przechowuje te ograniczenia bez ich stosowania, więc wiersze mogą je łamać. | check_not_enforced |
| defaults with functions Oracle lacks | brak wartości domyślnejWartość domyślna, której nie da się zapisać dla Oracle, jest pomijana i zgłaszana w raporcie. | default_not_translated |
| keys and indexes on a prefix, c(20) | indeks na SUBSTR kolumnyIndeks funkcyjny na tym samym początku kolumny odróżnia te same wiersze i indeksuje kolumny CLOB, których Oracle nie indeksuje w całości. | prefix_unique |
| FULLTEXT indexes | nie jest tworzoneOracle Text buduje wyszukiwanie pełnotekstowe z własnym typem indeksu i zapytaniami. | fulltext_not_created |
| SPATIAL indexes | nie jest tworzoneGeometrie są zapisywane jako bajty WKB, których indeks przestrzenny nie odczyta. | spatial_index_not_created |
| functional indexes, and indexes on whole CLOB or BLOB columns | nie jest tworzonyOracle nie indeksuje dużego obiektu w całości, a niektóre funkcje MySQL nie mają odpowiednika w Oracle. | index_skipped |
| foreign keys | po danych z ENABLE NOVALIDATE, potem walidowany z ostrzeżeniem o osieroconych wierszachZrzuty ładują się z FOREIGN_KEY_CHECKS=0, a MyISAM nigdy nie sprawdza kluczy, więc wiersze bez rodzica są częste. Klucz od razu sprawdza nowe wiersze i jest walidowany na końcu; osierocone wiersze zostawiają go niezwalidowanym z ostrzeżeniem, zamiast zatrzymać ładowanie. | |
| ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT | usunięteKlucze obce w Oracle działają tylko przy usuwaniu, z CASCADE lub SET NULL. | foreign_key_action_unsupported |
| foreign keys to columns without a unique key | nie jest tworzonyOracle wymaga klucza głównego lub ograniczenia unikalności na kolumnach, do których się odwołuje; InnoDB nie. | foreign_key_skipped |
| table and column names | wielkie litery dla zwykłych nazw, inne jak w źródleOracle zapisuje nazwy bez cudzysłowów wielkimi literami, więc zwykłe nazwy stają się wielkimi literami, a zapytania mogą pominąć cudzysłowy; inne nazwy zachowują wielkość liter i wymagają cudzysłowów. | identifier_renamed |
| names over 128 bytes | skróconeNazwy w Oracle 12.2 i nowszym mają do 128 bajtów. | name_shortened |
| GEOMETRY, POINT, POLYGON... | BLOB z WKBWKB to standardowy format, który czyta każda biblioteka przestrzenna; SDO_GEOMETRY wymaga metadanych Oracle Spatial. | geometry_as_blob |
| INET4, INET6, UUID (MariaDB) | VARCHAR2(39), VARCHAR2(36)Oracle nie ma żadnego z tych typów; tekst jest taki, jaki zwraca MariaDB. | |
| BINARY, VARBINARY, BLOB | RAW do 2000 bajtów, w przeciwnym razie BLOBBajty pozostają bajtami. | |
| PARTITION BY | jedna tabelaWiersze są te same; jeśli trzeba, podziel tabelę na partycje ponownie w Oracle. | partitions_dropped |
| WITH SYSTEM VERSIONING (MariaDB) | tabela z bieżącymi wierszamiZrzut zawiera tylko bieżące wiersze. | system_versioning_dropped |
| MyISAM, MEMORY and other engines | zwykła tabelaOracle ma jeden silnik tabel. | engine_dropped |
| views, triggers, procedures, functions and events | wymienione w raporcieIch kod jest napisany w języku MySQL, więc trafiają na listę do ręcznego odtworzenia. | not_converted_objects |
| dumps without CREATE TABLE | typy odczytane z wartościZrzut zrobiony z --no-create-info zawiera tylko wiersze, więc typy pochodzą z wartości. | no_schema |
| geometries in a dump without CREATE TABLE | BLOB z WKBFormat geometrii MySQL jest rozpoznawany po wartościach i zapisywany jako standardowe WKB. | geometry_inferred |
| _ci collations | dokładne porównanieOracle porównuje tekst dokładnie, chyba że ustawisz inaczej. | case_insensitive_collation |
| SET NAMES utf8 from utf8mb4 tables | przekonwertowane, z ostrzeżeniemmysqldump z MySQL 5.x domyślnie zapisuje 3-bajtowe utf8 i zastępuje każde emoji znakiem zapytania, zanim jakikolwiek konwerter zobaczy plik. | dump_lost_four_byte_chars |
| dumps without SET NAMES whose text isn't UTF-8 | odczytane jako Latin-1 (Windows-1252)latin1 w MySQL to Windows-1252, zwykłe kodowanie takich zrzutów. | charset_guessed |
| sjis, cp932, gbk, big5 dumps | odczytane jako UTF-8, z ostrzeżeniemTe kodowania nie są jeszcze dekodowane. | unsupported_charset |
| UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows | obliczoneNiektóre narzędzia do zrzutów zapisują wartości jako takie wywołania; są odczytywane jako wartości, które zwracają, przy czym w geograficznym WKT najpierw jest długość geograficzna. | |
| other expressions in rows | NULLKonwerter, który nie uruchamia bazy danych, nie może ich obliczyć. | expression_value |
| DEFAULT in VALUES | wartość domyślna kolumnyDosłowna wartość domyślna jest kopiowana do wiersza. | default_keyword_filled |
| DEFAULT in VALUES without a literal default | NULLNie ma wartości do skopiowania. | default_keyword_null |
| REPLACE and INSERT IGNORE | zwykłe wierszeZrzut ma jeden wiersz na klucz, więc wiersze są te same. | replace_as_insert |
| types IntoSQL doesn't know | CLOBTekst mieści każdą wartość; zmień typ po załadowaniu. | unknown_type |
| values that don't fit their column | NULLUszkodzony lub ręcznie pisany zrzut może zawierać wartości, których kolumna nie przyjmie; stają się NULL, aby reszta się załadowała. | invalid_value_null |
| unreadable geometries | NULLBajtów, które nie są geometrią, nie da się zapisać jako geometrii. | bad_geometry |
| dumps of several databases | jeden schemat, nazwa każdej tabeli zaczyna się od nazwy jej bazySkrypt ładuje się do schematu użytkownika, który go uruchamia, więc tabele z różnych baz danych dostają na początku nazwę swojej bazy. | databases_merged |
| CREATE SEQUENCE (MariaDB) | CREATE SEQUENCE, od osiągniętej wartościSekwencje w Oracle działają tak samo. | |
| VECTOR(n) (MariaDB 11.7+) | CLOB z liczbami float jako tablicą JSONTylko Oracle 23ai ma typ wektorowy; tablica JSON zachowuje każdą liczbę float w każdej wersji. | type_replaced |
Załaduj skrypt do Oracle
Skrypt tworzy tabele, kopiuje wiersze, a potem dodaje klucze, indeksy i klucze obce, więc ładuje się szybko i zatrzymuje przy pierwszym błędzie.
NLS_LANG=.AL32UTF8 sqlplus -S -L user@//localhost/mydb @mariadb.oracle.sqlKlucze obce są dodawane z ENABLE NOVALIDATE, więc nowe wiersze są sprawdzane od razu, a potem walidowane. Jeśli stary wiersz wskazuje na nieistniejący wiersz, skrypt podaje, którego ograniczenia to dotyczy, i zostawia je niezwalidowane, zamiast przerwać w połowie.
Przy dużym zrzucie uruchom SQL*Plus na tej samej maszynie co baza danych. Skrypt zatwierdza co 100 wierszy. Użytkownik, który go uruchamia, potrzebuje CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER i CREATE PROCEDURE oraz limitu w swojej przestrzeni tabel.
Jak zrobić zrzut MariaDB dla najlepszego wyniku
Konwerter odczytuje to, co zawiera zrzut. Te opcje zachowują w nim więcej twoich danych:
- --default-character-set=utf8mb4 zachowuje emoji i inne 4-bajtowe znaki, które zrzut utf8mb3 traci, zanim zobaczy go konwerter.
- --hex-blob zapisuje kolumny binarne i wartości VECTOR szesnastkowo, co przetrwa kopiowanie między systemami.
- --routines --triggers --events dodają te obiekty do zrzutu, aby raport mógł je wymienić.
Co nie jest konwertowane
Widoki, wyzwalacze, procedury składowane, funkcje i zdarzenia są pisane we własnym języku MariaDB. Raport wymienia je z nazwy i nigdy nie pomija ich po cichu, więc możesz je przepisać dla Oracle.
Pytania o konwersję MariaDB do Oracle
Nie ma tu odpowiedzi? Napisz do nas przez stronę kontaktu, a odpowie człowiek. Strona kontaktu
Czy mój zrzut jest wysyłany?
Nie. Konwerter działa w przeglądarce i odczytuje zrzut z dysku po kawałku, więc nigdy nie opuszcza on twojego komputera. Aplikacja na komputer i wiersz poleceń też konwertują na twoim komputerze.
Jak duży może być zrzut?
Konwerter nigdy nie trzyma całego zrzutu w pamięci: czyta plik dwa razy, fragmentami, i zapisuje skrypt na bieżąco. Zrzuty wielogigabajtowe konwertują się w przeglądarce, w aplikacji na komputer i w wierszu poleceń.
Z jakich wersji MariaDB może pochodzić zrzut?
Zrzuty z mariadb-dump i mysqldump z MariaDB od 10.3 do 12, z jednym INSERT na tabelę lub jednym na wiersz. Każdy testowy zrzut pochodzi z MariaDB 10.11, 11.4 i 11.8 i jest porównywany ze źródłem komórka po komórce.
Czy kolumny UUID, INET6, JSON i VECTOR są zachowywane?
Kolumny UUID i INET stają się VARCHAR2, JSON CLOB, a VECTOR tablicą JSON jego liczb float. Daty zerowe stają się NULL, podobnie jak puste ciągi, bo tak zapisuje je Oracle.
Czy wartości AUTO_INCREMENT i sekwencje są zachowywane?
Tak. Każda kolumna AUTO_INCREMENT staje się kolumną identity, która idzie dalej po najwyższym id. Sekwencje stają się sekwencjami Oracle, a wartości domyślne, które z nich pobierają, nadal z nich pobierają.
A procedury składowane i wyzwalacze?
Raport wymienia je z nazwy, ale nie są konwertowane, bo każda baza danych zapisuje je we własnym języku.
Na jakich wersjach Oracle ładuje się skrypt?
Oracle 19c i nowsze. Każdy testowy zrzut ładuje się na 21c i 23ai i zatrzymuje przy pierwszym błędzie, jeśli coś pójdzie nie tak.