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

Konwertuj Oracle do MySQL

Upuść plik .sql zapisany przez Database Export w SQL Developer lub przez SQLcl, z tabelami i instrukcjami Insert, i pobierz skrypt MySQL z tymi samymi tabelami, kluczami, indeksami i danymi. Każda wartość, której MySQL nie może przechować bez zmian, i każdy obiekt, którego nie przenosi, są wymienione w raporcie.

Twój plik
sqlshop_2024_oracle.sqlPlik przykładowy, 9,3 kB
Twoja baza danych

18 wierszy przekonwertowanych, bez poprawek, brak odrzuconych

Pokaż

Tabele w pliku shop_2024_oracle.sqlZrzut Oracle · zapisany przez SQL Developer · utf-8

  • customers8 wierszy
    7 kolumn
    idbigint not null
    namevarchar(100) not null
    emailvarchar(150) not null
    countrychar(2) not null
    is_activesmallint not null
    signed_updatetime
    created_atdatetime not null
  • orders10 wierszy
    9 kolumn
    idbigint not null
    customer_idbigint not null
    invoicebigint
    statusvarchar(10) not null
    totaldecimal(10,2) not null
    itemsint not null
    ordered_atdatetime not null
    shipped_atdatetime
    notevarchar(255)
-- Written by IntoSQL from a Oracle dump. Load it with: mysql --default-character-set=utf8mb4 <database> < <file>
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO,ALLOW_INVALID_DATES';

CREATE TABLE `customers` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `email` varchar(150) NOT NULL,
  `country` char(2) NOT NULL DEFAULT 'US',
  `is_active` smallint NOT NULL DEFAULT 1,
  `signed_up` datetime,
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `customers_email_uk` (`email`),
  CONSTRAINT `check1` CHECK (`is_active` IN (0, 1))
) AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='People who bought at least once';

CREATE TABLE `orders` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `customer_id` bigint NOT NULL,
  `invoice` bigint,
  `status` varchar(10) NOT NULL DEFAULT 'pending',
  `total` decimal(10,2) NOT NULL,
  `items` int NOT NULL DEFAULT 1,
  `ordered_at` datetime NOT NULL,
  `shipped_at` datetime,
  `note` varchar(255),
  PRIMARY KEY (`id`),
  KEY `orders_status_date_ix` (`status`,`ordered_at`),
  CONSTRAINT `check1` CHECK (`status` IN ('pending', 'paid', 'shipped', 'cancelled')),
  CONSTRAINT `orders_customer_fk` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`)
) AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (1,'Ana Martínez','ana@example.com','MX',1,'2023-01-15 00:00:00','2023-01-15 10:24:00.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (2,'Zoë Müller','zoe@example.de','DE',1,'2023-02-03 00:00:00','2023-02-03 08:11:42.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (3,'José Peña','jose@example.es','ES',0,'2023-03-21 00:00:00','2023-03-21 19:05:17.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (4,'李雷','lilei@example.cn','CN',1,'2023-05-09 00:00:00','2023-05-09 02:40:00.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (5,'Noah O\'Brien','noah@example.ie','IE',1,NULL,'2023-06-30 14:00:00.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (6,'Amélie Laurent','amelie@example.fr','FR',1,'2024-01-02 00:00:00','2024-01-02 09:30:00.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (7,'Ravi Patel','ravi@example.in','IN',0,'2024-02-29 00:00:00','2024-02-29 23:59:59.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (8,'Sofia Rossi 🌻','sofia@example.it','IT',1,'2024-04-12 00:00:00','2024-04-12 12:12:12.000000');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (1,1,1000,'shipped',129.9,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL);
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (2,2,1001,'paid',54,1,'2024-03-02 11:15:00',NULL,'Gift wrap 🎁');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (3,1,1002,'cancelled',12.5,1,'2024-03-03 09:45:00',NULL,'Customer changed their mind');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (4,4,1003,'shipped',980,12,'2024-03-05 02:10:00','2024-03-07 08:00:00','请小心轻放');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (5,5,1004,'pending',45.75,2,'2024-03-08 17:20:00',NULL,'Leave at the door; ring twice');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (6,6,1005,'shipped',310.4,5,'2024-03-10 13:00:00','2024-03-11 09:00:00','Fragile: "glass"');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (7,8,1006,'paid',76.2,2,'2024-03-11 18:45:00',NULL,NULL);
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (8,2,1007,'paid',19.99,1,'2024-03-12 08:00:00',NULL,'Paid at the counter');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (9,3,1008,'shipped',64,2,'2024-03-14 15:30:00',NULL,'Shipping date never recorded');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (10,7,1009,'paid',1499,1,'2024-03-15 21:05:00',NULL,'C:\\Users\\ravi\\invoice.pdf');

SET UNIQUE_CHECKS = 1;
SET FOREIGN_KEY_CHECKS = 1;

Poprawki

Nic nie wymagało poprawek.

Do sprawdzenia

  • Pominięto 1 sekwencję; MySQL nie ma sekwencji. Przechowuj następną wartość w tabeli, jeśli twoja aplikacja jej potrzebuje.
  • Wartości domyślnej "invoice" w tabeli orders nie da się zapisać dla MySQL (a sequence), więc kolumna nie ma wartości domyślnej. Dodaj wartość domyślną ręcznie, jeśli nowe wiersze jej potrzebują.

Plik jest konwertowany na tym komputerze i nigdy nie jest wysyłany.

Inne przykłady:

Co zmienia się między Oracle a MySQL

Każdy wiersz to reguła stosowana przez konwerter, z wpisem, który dodaje do raportu, gdy reguła coś zmienia w twoich danych.

  • BOOLEAN (23ai)

    tinyint(1)

    MySQL nie ma kolumny logicznej, więc TRUE i FALSE to 1 i 0.

  • VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG

    varchar(n) do 1024 znaków, powyżej typy text

    Długości liczą znaki, niezależnie od tego, czy Oracle liczył bajty, czy znaki, więc każda wartość się mieści.

  • NUMBER, NUMBER(p,s), FLOAT(b)

    decimal(p,s) lub bigint

    NUMBER zachowuje każdą cyfrę; NUMBER bez precyzji, którego wszystkie wartości są liczbami całkowitymi do 18 cyfr, staje się 64-bitową liczbą całkowitą, a ujemna skala mieści tyle samo cyfr przed przecinkiem.

  • INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND

    varchar(100) z tekstem Oracle, np. +01-06

    TIME w MySQL mieści czasy trwania do 838 godzin i nie ma lat ani miesięcy; tekst zachowuje każdą część.

    Wpis w raporcie: type_replaced

  • DATE, TIMESTAMP(p)

    datetime(p)

    DATE w Oracle przechowuje czas z dokładnością do sekundy, więc jest datą z godziną. Eksport w sesji amerykańskiej lub niemieckiej zapisuje daty bez godziny i stulecia (DD-MON-RR); eksportuj w sesji ISO (SYYYY-MM-DD HH24:MI:SS), aby je zachować.

  • TIMESTAMP(7) to TIMESTAMP(9)

    sześć cyfr ułamka sekundy, siódma obcięta

    MySQL przechowuje mikrosekundy; siódma cyfra (100 nanosekund) jest obcinana, nigdy zaokrąglana, więc żadna wartość nie przechodzi na następną sekundę ani dzień.

    Wpis w raporcie: fraction_cut

  • TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE

    datetime(p) w UTC

    TIMESTAMP w MySQL sięga tylko roku 2038, więc momenty są zapisywane jako datetime w UTC, ten sam moment niezależnie od przesunięcia każdej wartości.

    Wpis w raporcie: moments_as_utc

  • JSON (21c), and CLOB holding JSON

    json

    Te same wartości JSON; SQL NULL zapisany przez eksport jako 'null' pozostaje NULL.

  • BLOB, RAW(n), LONG RAW

    binary(n), varbinary(n) i typy blob

    Bajty pozostają bajtami.

  • ROWID, UROWID, XMLTYPE, SDO_GEOMETRY

    text

    Własne typy Oracle nie mają odpowiednika; ich wartości zachowują swój tekst, łącznie z wartościami ROWID, choć poza Oracle nic nie znaczą.

    Wpis w raporcie: type_replaced

  • collations that ignore case (BINARY_CI)

    dokładne porównanie (utf8mb4_bin)

    Tabele używają utf8mb4_bin, więc klucze unikalne rozróżniają to, co rozróżniał Oracle; kolumny, które ignorowały wielkość liter, to tracą. Reguły akcentów różnią się między wersjami, więc żadne porównywanie _ci nie odpowiada temu z Oracle w każdej z nich.

    Wpis w raporcie: case_insensitive_collation

  • identity columns, and a sequence a BEFORE INSERT trigger assigns

    AUTO_INCREMENT, kontynuowane po najwyższym id

    Skopiowane id ładują się bez zmian, a licznik idzie dalej od najwyższego z nich. Kolumna, którą wyzwalacz wypełnia z sekwencji (sposób sprzed 12c), też staje się kolumną identity.

  • identity columns the target can't count

    zwykła liczba całkowita

    MySQL liczy jedną kolumnę na tabelę, na początku klucza; każda inna zachowuje wartości bez licznika.

    Wpis w raporcie: counter_dropped

  • CREATE SEQUENCE

    nie jest tworzone

    Eksport zapisuje, dokąd doszła sekwencja, jako jej START WITH, więc kontynuuje ona od tego miejsca.

    Wpis w raporcie: sequence_not_converted

  • virtual columns (GENERATED ALWAYS AS ... VIRTUAL)

    kolumny generowane, STORED przy PERSISTED, w przeciwnym razie VIRTUAL

    MySQL oblicza je według tej samej formuły; wartości, które eksport dla nich zapisał, są pomijane.

  • virtual columns with functions IntoSQL doesn't write, and the || operator

    zwykła kolumna

    Formuła, której nie da się zapisać dla MySQL, zostawia zwykłą kolumnę i wpis w raporcie; wartości, które eksport zapisał dla kolumn wirtualnych, są pomijane, a MySQL nie może ich obliczyć.

    Wpis w raporcie: generated_not_translated

  • defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)

    brak wartości domyślnej

    Wartość domyślna, której nie da się zapisać, jest pomijana i zgłaszana w raporcie.

    Wpis w raporcie: default_not_translated

  • CHECK constraints

    przetłumaczone

    MySQL 5.7 przechowuje je bez sprawdzania; pozostałe sprawdzają je przy ładowaniu każdego wiersza.

  • CHECK constraints with functions IntoSQL doesn't write

    nie jest tworzone

    Ograniczenie CHECK, którego nie da się zapisać, jest pomijane i zgłaszane w raporcie.

    Wpis w raporcie: check_skipped

  • CHECK constraints that are DISABLE or ENABLE NOVALIDATE

    nie jest tworzone

    Oracle nie stosuje tych ograniczeń CHECK do już istniejących wierszy, więc wiersze mogą je łamać.

    Wpis w raporcie: check_not_enforced

  • function-based, bitmap and domain indexes

    nie jest tworzone

    IntoSQL zapisuje indeksy b-tree na całych kolumnach; pozostałe utwórz ponownie po załadowaniu.

    Wpis w raporcie: index_skipped

  • foreign keys

    klucze obce, ładowane z FOREIGN_KEY_CHECKS=0

    Wiersze ładują się w dowolnej kolejności, a klucze sprawdzają potem nowe wiersze.

  • foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE ones

    nie jest tworzone

    Klucz nie może wskazywać tabeli, której nie ma, a klucz, którego Oracle nie sprawdza, może mieć wiersze bez rodzica.

    Wpis w raporcie: foreign_key_skipped

  • partitioned tables

    jedna tabela z wierszami wszystkich partycji

    Wiersze są te same; jeśli trzeba, podziel tabelę na partycje ponownie w MySQL.

    Wpis w raporcie: partitions_dropped

  • several schemas in one export

    jedna baza danych, nazwa każdej tabeli zaczyna się od nazwy jej schematu

    Schematy w MySQL to bazy danych, których eksport ładowany do jednej bazy nie może utworzyć; eksport jednego schematu zachowuje nazwy swoich tabel.

    Wpis w raporcie: schemas_merged

  • NOT NULL columns with values that become NULL

    NOT NULL usunięte

    Kolumna, której wartości musiały stać się NULL, nie może zachować NOT NULL, bo ładowanie by się zatrzymało.

    Wpis w raporcie: not_null_relaxed

  • views, synonyms, types, packages, procedures, functions and other triggers

    wymienione w raporcie

    Ich kod jest napisany w PL/SQL, więc trafiają na listę do ręcznego odtworzenia.

    Wpis w raporcie: not_converted_objects

  • exports without CREATE TABLE (data only)

    typy odczytane z wartości

    Eksport samych danych zawiera tylko wiersze, więc typy pochodzą z wartości.

    Wpis w raporcie: no_schema

  • expressions in INSERT values other than the ones exports write

    NULL

    Konwerter, który nie uruchamia bazy danych, nie może ich obliczyć; to_date, to_timestamp, TO_CLOB, HEXTORAW i inne, które zapisują eksporty, są odczytywane.

    Wpis w raporcie: expression_value

  • types IntoSQL doesn't know, and object types

    longtext

    Tekst mieści każdą wartość; zmień typ po załadowaniu.

    Wpis w raporcie: unknown_type

  • dates before year 1 and time zones given as region names

    NULL

    MySQL przechowuje lata od 1000 do 9999, a Oracle sięga do roku 1. Takie wartości stają się NULL, a raport je liczy.

    Wpis w raporcie: date_out_of_range

  • NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE

    NULL

    Typy zmiennoprzecinkowe w MySQL nie mają NaN ani nieskończoności, więc te wartości stają się NULL, a raport je liczy.

    Wpis w raporcie: invalid_value_null

  • NUL characters in text

    zachowane

    Wartość jest kopiowana, a znak NUL jest w niej zapisany jako sekwencja ucieczki.

  • text that isn't valid in its encoding

    błędne bajty jako znak zastępczy

    Skrypt jest w UTF-8 i każda wartość musi być poprawnym tekstem.

    Wpis w raporcie: invalid_utf8_replaced

  • text decoded twice (ñ)

    skopiowane bez zmian

    Skrypt zawiera dokładnie te znaki, więc są kopiowane; raport je wskazuje.

    Wpis w raporcie: mojibake_suspected

W OracleW MySQLWpis w raporcie
BOOLEAN (23ai)tinyint(1)MySQL nie ma kolumny logicznej, więc TRUE i FALSE to 1 i 0.
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONGvarchar(n) do 1024 znaków, powyżej typy textDługości liczą znaki, niezależnie od tego, czy Oracle liczył bajty, czy znaki, więc każda wartość się mieści.
NUMBER, NUMBER(p,s), FLOAT(b)decimal(p,s) lub bigintNUMBER zachowuje każdą cyfrę; NUMBER bez precyzji, którego wszystkie wartości są liczbami całkowitymi do 18 cyfr, staje się 64-bitową liczbą całkowitą, a ujemna skala mieści tyle samo cyfr przed przecinkiem.
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECONDvarchar(100) z tekstem Oracle, np. +01-06TIME w MySQL mieści czasy trwania do 838 godzin i nie ma lat ani miesięcy; tekst zachowuje każdą część.type_replaced
DATE, TIMESTAMP(p)datetime(p)DATE w Oracle przechowuje czas z dokładnością do sekundy, więc jest datą z godziną. Eksport w sesji amerykańskiej lub niemieckiej zapisuje daty bez godziny i stulecia (DD-MON-RR); eksportuj w sesji ISO (SYYYY-MM-DD HH24:MI:SS), aby je zachować.
TIMESTAMP(7) to TIMESTAMP(9)sześć cyfr ułamka sekundy, siódma obciętaMySQL przechowuje mikrosekundy; siódma cyfra (100 nanosekund) jest obcinana, nigdy zaokrąglana, więc żadna wartość nie przechodzi na następną sekundę ani dzień.fraction_cut
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONEdatetime(p) w UTCTIMESTAMP w MySQL sięga tylko roku 2038, więc momenty są zapisywane jako datetime w UTC, ten sam moment niezależnie od przesunięcia każdej wartości.moments_as_utc
JSON (21c), and CLOB holding JSONjsonTe same wartości JSON; SQL NULL zapisany przez eksport jako 'null' pozostaje NULL.
BLOB, RAW(n), LONG RAWbinary(n), varbinary(n) i typy blobBajty pozostają bajtami.
ROWID, UROWID, XMLTYPE, SDO_GEOMETRYtextWłasne typy Oracle nie mają odpowiednika; ich wartości zachowują swój tekst, łącznie z wartościami ROWID, choć poza Oracle nic nie znaczą.type_replaced
collations that ignore case (BINARY_CI)dokładne porównanie (utf8mb4_bin)Tabele używają utf8mb4_bin, więc klucze unikalne rozróżniają to, co rozróżniał Oracle; kolumny, które ignorowały wielkość liter, to tracą. Reguły akcentów różnią się między wersjami, więc żadne porównywanie _ci nie odpowiada temu z Oracle w każdej z nich.case_insensitive_collation
identity columns, and a sequence a BEFORE INSERT trigger assignsAUTO_INCREMENT, kontynuowane po najwyższym idSkopiowane id ładują się bez zmian, a licznik idzie dalej od najwyższego z nich. Kolumna, którą wyzwalacz wypełnia z sekwencji (sposób sprzed 12c), też staje się kolumną identity.
identity columns the target can't countzwykła liczba całkowitaMySQL liczy jedną kolumnę na tabelę, na początku klucza; każda inna zachowuje wartości bez licznika.counter_dropped
CREATE SEQUENCEnie jest tworzoneEksport zapisuje, dokąd doszła sekwencja, jako jej START WITH, więc kontynuuje ona od tego miejsca.sequence_not_converted
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)kolumny generowane, STORED przy PERSISTED, w przeciwnym razie VIRTUALMySQL oblicza je według tej samej formuły; wartości, które eksport dla nich zapisał, są pomijane.
virtual columns with functions IntoSQL doesn't write, and the || operatorzwykła kolumnaFormuła, której nie da się zapisać dla MySQL, zostawia zwykłą kolumnę i wpis w raporcie; wartości, które eksport zapisał dla kolumn wirtualnych, są pomijane, a MySQL nie może ich obliczyć.generated_not_translated
defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)brak wartości domyślnejWartość domyślna, której nie da się zapisać, jest pomijana i zgłaszana w raporcie.default_not_translated
CHECK constraintsprzetłumaczoneMySQL 5.7 przechowuje je bez sprawdzania; pozostałe sprawdzają je przy ładowaniu każdego wiersza.
CHECK constraints with functions IntoSQL doesn't writenie jest tworzoneOgraniczenie CHECK, którego nie da się zapisać, jest pomijane i zgłaszane w raporcie.check_skipped
CHECK constraints that are DISABLE or ENABLE NOVALIDATEnie jest tworzoneOracle nie stosuje tych ograniczeń CHECK do już istniejących wierszy, więc wiersze mogą je łamać.check_not_enforced
function-based, bitmap and domain indexesnie jest tworzoneIntoSQL zapisuje indeksy b-tree na całych kolumnach; pozostałe utwórz ponownie po załadowaniu.index_skipped
foreign keysklucze obce, ładowane z FOREIGN_KEY_CHECKS=0Wiersze ładują się w dowolnej kolejności, a klucze sprawdzają potem nowe wiersze.
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE onesnie jest tworzoneKlucz nie może wskazywać tabeli, której nie ma, a klucz, którego Oracle nie sprawdza, może mieć wiersze bez rodzica.foreign_key_skipped
partitioned tablesjedna tabela z wierszami wszystkich partycjiWiersze są te same; jeśli trzeba, podziel tabelę na partycje ponownie w MySQL.partitions_dropped
several schemas in one exportjedna baza danych, nazwa każdej tabeli zaczyna się od nazwy jej schematuSchematy w MySQL to bazy danych, których eksport ładowany do jednej bazy nie może utworzyć; eksport jednego schematu zachowuje nazwy swoich tabel.schemas_merged
NOT NULL columns with values that become NULLNOT NULL usunięteKolumna, której wartości musiały stać się NULL, nie może zachować NOT NULL, bo ładowanie by się zatrzymało.not_null_relaxed
views, synonyms, types, packages, procedures, functions and other triggerswymienione w raporcieIch kod jest napisany w PL/SQL, więc trafiają na listę do ręcznego odtworzenia.not_converted_objects
exports without CREATE TABLE (data only)typy odczytane z wartościEksport samych danych zawiera tylko wiersze, więc typy pochodzą z wartości.no_schema
expressions in INSERT values other than the ones exports writeNULLKonwerter, który nie uruchamia bazy danych, nie może ich obliczyć; to_date, to_timestamp, TO_CLOB, HEXTORAW i inne, które zapisują eksporty, są odczytywane.expression_value
types IntoSQL doesn't know, and object typeslongtextTekst mieści każdą wartość; zmień typ po załadowaniu.unknown_type
dates before year 1 and time zones given as region namesNULLMySQL przechowuje lata od 1000 do 9999, a Oracle sięga do roku 1. Takie wartości stają się NULL, a raport je liczy.date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLENULLTypy zmiennoprzecinkowe w MySQL nie mają NaN ani nieskończoności, więc te wartości stają się NULL, a raport je liczy.invalid_value_null
NUL characters in textzachowaneWartość jest kopiowana, a znak NUL jest w niej zapisany jako sekwencja ucieczki.
text that isn't valid in its encodingbłędne bajty jako znak zastępczySkrypt jest w UTF-8 i każda wartość musi być poprawnym tekstem.invalid_utf8_replaced
text decoded twice (ñ)skopiowane bez zmianSkrypt zawiera dokładnie te znaki, więc są kopiowane; raport je wskazuje.mojibake_suspected

Załaduj skrypt do MySQL

Skrypt tworzy tabele, kopiuje wiersze, a potem dodaje klucze, indeksy i klucze obce, więc ładuje się szybko i zatrzymuje przy pierwszym błędzie.

mysql --default-character-set=utf8mb4 mydb < oracle.mysql.sql

Klucze obce są tworzone tak, jak deklaruje je zrzut, z FOREIGN_KEY_CHECKS=0 podczas ładowania wierszy, więc wiersz wskazujący na brakujący wiersz nie zatrzymuje ładowania.

Przy dużym zrzucie uruchom klienta na tej samej maszynie co serwer i zwiększ max_allowed_packet, jeśli pojedynczy wiersz jest bardzo duży.

IntoSQL Pro ładuje plik prosto do MySQL z aplikacji na komputer lub wiersza poleceń, bez pisania skryptu.

Jak zrobić zrzut Oracle dla najlepszego wyniku

Konwerter odczytuje to, co zawiera zrzut. Te opcje zachowują w nim więcej twoich danych:

  • W SQL Developer wybierz Tools, Database Export, z DDL i formatem danych Insert. SQLcl zapisuje to samo z SET SQLFORMAT INSERT.
  • Przed eksportem uruchom ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS': domyślny format zapisuje daty bez godziny i stulecia.
  • Plik .dmp z exp lub expdp jest binarny: zaimportuj go do bazy Oracle, np. Oracle Database Free w Dockerze, i wyeksportuj przez SQL Developer.

Co nie jest konwertowane

Widoki, pakiety, procedury, funkcje, wyzwalacze, typy i synonimy są pisane w PL/SQL. Raport wymienia je z nazwy i nigdy nie pomija ich po cichu, więc możesz je przepisać dla MySQL.

Pytania o konwersję Oracle do MySQL

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 mogę przekonwertować plik .dmp z exp lub expdp?

Nie bezpośrednio: Data Pump i oryginalny Export zapisują format binarny, który czyta tylko Oracle. Zaimportuj plik do dowolnej bazy Oracle (Oracle Database Free działa w Dockerze) i wyeksportuj go przez Database Export w SQL Developer lub przez SQLcl. Konwerter informuje o tym, gdy dostanie plik .dmp.

Z jakich wersji Oracle może pochodzić eksport?

Eksporty z SQL Developer i SQLcl, z definicjami tabel z DBMS_METADATA, z Oracle od wersji 11g. Każdy testowy eksport pochodzi z Oracle 21c i 23ai, w sesjach amerykańskich, niemieckich i ISO, i jest porównywany ze źródłem komórka po komórce.

Co dzieje się z NUMBER, DATE i innymi typami Oracle?

NUMBER staje się decimal, bigint dla liczb całkowitych, a powyżej 65 cyfr tekstem; DATE staje się datetime i zachowuje godzinę; CLOB staje się longtext, BLOB blob, a interwały zachowują tekst Oracle. NaN i Infinity stają się NULL, a raport je liczy.

Czy kolumny identity i sekwencje są zachowywane?

Kolumny identity stają się AUTO_INCREMENT i idą dalej po najwyższym id. MySQL nie ma sekwencji, więc trafiają one do raportu, podobnie jak wartości domyślne, które z nich pobierają.

A pakiety PL/SQL, procedury 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 MySQL ładuje się skrypt?

MySQL 5.7 i nowsze. Każdy testowy eksport ładuje się na 5.7 i 9 i zatrzymuje przy pierwszym błędzie, jeśli coś pójdzie nie tak.