Przejdź do treści
Strona główna IntoSQL

Konwertuj MySQL do Oracle

Upuść zrzut z mysqldump, mariadb-dump, mysqlpump, 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.

Twój plik
sqlshop_2024.sqlPlik przykładowy, 5,1 kB
Twoja baza danych

18 wierszy przekonwertowanych, 4 poprawki, brak odrzuconych

Pokaż

Tabele w pliku shop_2024.sqlZrzut MySQL 8.0.46 · zapisany przez mysqldump · utf8mb4

  • customerszapisana jako CUSTOMERS8 wierszy2
    7 kolumn
    IDNUMBER(10) not null
    NAMEVARCHAR2(100 CHAR) not null
    EMAILVARCHAR2(150 CHAR) not null
    COUNTRYVARCHAR2(2 CHAR) not null
    IS_ACTIVENUMBER(1) not null
    SIGNED_UPDATE
    CREATED_ATTIMESTAMP(0) WITH TIME ZONE not null
  • orderszapisana jako ORDERS10 wierszy2
    9 kolumn
    IDNUMBER(10) not null
    CUSTOMER_IDNUMBER(10) not null
    STATUSVARCHAR2(9 CHAR)
    TOTALNUMBER(10,2) not null
    ITEMSNUMBER(5) not null
    ORDERED_ATTIMESTAMP(0) not null
    SHIPPED_ATTIMESTAMP(0)
    NOTEVARCHAR2(255 CHAR)
    UPDATED_ATTIMESTAMP(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 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,
    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),
    "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"
) VALUES (
1,
'Ana Martínez',
'ana@example.com',
'MX',
1,
DATE '2023-01-15',
TIMESTAMP '2023-01-15 10:24:00 +00:00'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
2,
'Zoë Müller',
'zoe@example.de',
'DE',
1,
DATE '2023-02-03',
TIMESTAMP '2023-02-03 08:11:42 +00:00'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
3,
'José Peña',
'jose@example.es',
'ES',
0,
DATE '2023-03-21',
TIMESTAMP '2023-03-21 19:05:17 +00:00'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
4,
'李雷',
'lilei@example.cn',
'CN',
1,
DATE '2023-05-09',
TIMESTAMP '2023-05-09 02:40:00 +00:00'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
5,
'Noah O''Brien',
'noah@example.ie',
'IE',
1,
NULL,
TIMESTAMP '2023-06-30 14:00:00 +00:00'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
6,
'Amélie Laurent',
'amelie@example.fr',
'FR',
1,
DATE '2024-01-02',
TIMESTAMP '2024-01-02 09:30:00 +00:00'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
7,
'Ravi Patel',
'ravi@example.in',
'IN',
0,
DATE '2024-02-29',
TIMESTAMP '2024-02-29 23:59:59 +00:00'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
8,
'Sofia Rossi 🌻',
'sofia@example.it',
'IT',
1,
DATE '2024-04-12',
TIMESTAMP '2024-04-12 12:12:12 +00:00'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"UPDATED_AT"
) VALUES (
1,
1,
'shipped',
129.90,
3,
TIMESTAMP '2024-03-01 10:00:00',
TIMESTAMP '2024-03-02 16:30:00',
NULL,
TIMESTAMP '2024-03-02 16:30:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"UPDATED_AT"
) VALUES (
2,
2,
'paid',
54.00,
1,
TIMESTAMP '2024-03-02 11:15:00',
NULL,
'Gift wrap 🎁',
TIMESTAMP '2024-03-02 11:20:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"UPDATED_AT"
) VALUES (
3,
1,
'cancelled',
12.50,
1,
TIMESTAMP '2024-03-03 09:45:00',
NULL,
'Customer changed their mind',
TIMESTAMP '2024-03-03 10:00:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"UPDATED_AT"
) VALUES (
4,
4,
'shipped',
980.00,
12,
TIMESTAMP '2024-03-05 02:10:00',
TIMESTAMP '2024-03-07 08:00:00',
'请小心轻放',
TIMESTAMP '2024-03-07 08:00:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"UPDATED_AT"
) VALUES (
5,
5,
'pending',
45.75,
2,
TIMESTAMP '2024-03-08 17:20:00',
NULL,
'Leave at the door; ring twice',
TIMESTAMP '2024-03-08 17:20:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"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"',
TIMESTAMP '2024-03-11 09:00:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"UPDATED_AT"
) VALUES (
7,
8,
'paid',
76.20,
2,
TIMESTAMP '2024-03-11 18:45:00',
NULL,
NULL,
TIMESTAMP '2024-03-11 18:46:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"UPDATED_AT"
) VALUES (
8,
2,
NULL,
19.99,
1,
TIMESTAMP '2024-03-12 08:00:00',
NULL,
'Status lost in an old import',
TIMESTAMP '2024-03-12 08:00:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"UPDATED_AT"
) VALUES (
9,
3,
'shipped',
64.00,
2,
TIMESTAMP '2024-03-14 15:30:00',
NULL,
'Shipping date never recorded',
TIMESTAMP '2024-03-15 10:00:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"UPDATED_AT"
) VALUES (
10,
7,
'paid',
1499.00,
1,
TIMESTAMP '2024-03-15 21:05:00',
NULL,
'C:\Users\ravi\invoice.pdf',
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

  1. "signed_up" w tabeli customers dopuszcza teraz NULL: części jej wartości nie dało się zapisać i są NULL.
  2. 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.
  3. "status" w tabeli orders dopuszcza teraz NULL: części jej wartości nie dało się zapisać i są NULL.
  4. "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 MySQL 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 MySQLW OracleWpis w raporcie
TINYINT(1), BOOLNUMBER(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 integersNUMBER 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 widthsusunię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 NULLNOT 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 valuesNULLOracle 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
TIMEINTERVAL 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ść.
YEARNUMBER(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 bytesCLOBVARCHAR2 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
DATETIMETIMESTAMPDATETIME to wskazanie zegara bez strefy czasowej, jak TIMESTAMP. DATE staje się DATE w Oracle, który zawiera też godzinę, ustawioną na północ.
TIMESTAMPTIMESTAMP 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
ENUMVARCHAR2 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 listbez CHECKWartości spoza listy nie przeszłyby ograniczenia CHECK, więc nie jest ono tworzone.enum_check_skipped
SETVARCHAR2 w zapisie MySQL ('a,b')Oracle nie ma typu zbioru; tekst jest taki, jaki zwraca MySQL.
JSONCLOBFunkcje JSON w Oracle odczytują JSON z tekstu w każdej wersji, a CLOB mieści wartości dowolnego rozmiaru.
NUL bytes in textzachowaneVARCHAR2 i CLOB mogą zawierać znak NUL, więc wartość jest kopiowana bez zmian.
text that isn't valid in its character setbłę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_INCREMENTGENERATED 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 keyjeden licznik dla tabeliMyISAM liczy osobno w każdej grupie pierwszej kolumny klucza; Oracle ma jeden licznik na tabelę.myisam_group_autoincrement
ON UPDATE CURRENT_TIMESTAMPwyzwalacz BEFORE UPDATEWyzwalacz ustawia kolumnę na bieżący czas, gdy aktualizacja jej nie ustawia.on_update_trigger
generated columnskolumny 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 lackszwykła kolumnaFormuła, której nie da się zapisać dla Oracle, zostawia zwykłą kolumnę i wpis w raporcie.generated_not_translated
INVISIBLE columnskolumny INVISIBLEOracle ukrywa niewidoczne kolumny przed SELECT *, tak jak MySQL.
CHECK constraintsprzetłumaczone, wewnątrz CREATE TABLECHECK w definicji tabeli działa przy ładowaniu każdego wiersza.
CHECK constraints with functions Oracle lacksnie jest tworzoneOgraniczenie CHECK, którego nie da się zapisać dla Oracle, jest pomijane i zgłaszane w raporcie.check_skipped
CHECK ... NOT ENFORCEDnie jest tworzoneMySQL przechowuje te ograniczenia bez ich stosowania, więc wiersze mogą je łamać.check_not_enforced
defaults with functions Oracle lacksbrak 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 indexesnie jest tworzoneOracle Text buduje wyszukiwanie pełnotekstowe z własnym typem indeksu i zapytaniami.fulltext_not_created
SPATIAL indexesnie 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 columnsnie jest tworzonyOracle nie indeksuje dużego obiektu w całości, a niektóre funkcje MySQL nie mają odpowiednika w Oracle.index_skipped
foreign keyspo 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 DEFAULTusunię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 keynie 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 nameswielkie 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 bytesskró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, BLOBRAW do 2000 bajtów, w przeciwnym razie BLOBBajty pozostają bajtami.
PARTITION BYjedna 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 engineszwykła tabelaOracle ma jeden silnik tabel.engine_dropped
views, triggers, procedures, functions and eventswymienione w raporcieIch kod jest napisany w języku MySQL, więc trafiają na listę do ręcznego odtworzenia.not_converted_objects
dumps without CREATE TABLEtypy 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 TABLEBLOB z WKBFormat geometrii MySQL jest rozpoznawany po wartościach i zapisywany jako standardowe WKB.geometry_inferred
_ci collationsdokładne porównanieOracle porównuje tekst dokładnie, chyba że ustawisz inaczej.case_insensitive_collation
SET NAMES utf8 from utf8mb4 tablesprzekonwertowane, 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-8odczytane jako Latin-1 (Windows-1252)latin1 w MySQL to Windows-1252, zwykłe kodowanie takich zrzutów.charset_guessed
sjis, cp932, gbk, big5 dumpsodczytane jako UTF-8, z ostrzeżeniemTe kodowania nie są jeszcze dekodowane.unsupported_charset
UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rowsobliczoneNiektó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 rowsNULLKonwerter, który nie uruchamia bazy danych, nie może ich obliczyć.expression_value
DEFAULT in VALUESwartość domyślna kolumnyDosłowna wartość domyślna jest kopiowana do wiersza.default_keyword_filled
DEFAULT in VALUES without a literal defaultNULLNie ma wartości do skopiowania.default_keyword_null
REPLACE and INSERT IGNOREzwykłe wierszeZrzut ma jeden wiersz na klucz, więc wiersze są te same.replace_as_insert
types IntoSQL doesn't knowCLOBTekst mieści każdą wartość; zmień typ po załadowaniu.unknown_type
values that don't fit their columnNULLUszkodzony 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 geometriesNULLBajtów, które nie są geometrią, nie da się zapisać jako geometrii.bad_geometry
dumps of several databasesjeden 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 @mysql.oracle.sql

Klucze 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 MySQL 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 utf8 traci, zanim zobaczy go konwerter.
  • --hex-blob zapisuje kolumny binarne 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 każdej bazy danych. Raport wymienia je z nazwy i nigdy nie pomija ich po cichu, więc możesz je przepisać dla Oracle.

Pytania o konwersję MySQL 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ń.

Czy odczytuje zrzuty MariaDB?

Tak. Zrzuty z mariadb-dump i z MariaDB od 10.3 do 12 są konwertowane tak samo, łącznie z kolumnami INET6, INET4 i UUID z MariaDB.

Co dzieje się z datami 0000-00-00?

Oracle nie ma daty zerowej, więc stają się NULL, a kolumna przyjmuje NULL. Raport podaje, ile ich było w każdej kolumnie. Puste ciągi też stają się NULL, bo tak zapisuje je Oracle.

Czy wartości AUTO_INCREMENT są zachowywane?

Tak. Każda kolumna AUTO_INCREMENT staje się kolumną identity, każdy wiersz zachowuje swoje id, a kolejne id idzie po najwyższym albo po AUTO_INCREMENT tabeli, jeśli ten jest wyższy.

Czy TINYINT(1) staje się boolean?

Oracle przed 23ai nie ma kolumny logicznej. Kolumna, której wszystkie wartości to 0 lub 1, staje się NUMBER(1) z ograniczeniem CHECK, które to utrzymuje; kolumna z innymi liczbami je zachowuje, a raport wyjaśnia dlaczego.

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. Wyjątkiem jest ON UPDATE CURRENT_TIMESTAMP: staje się wyzwalaczem Oracle.

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.