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

Konwertuj SQL Server do MySQL

Upuść skrypt, który Generate Scripts w SSMS zapisuje ze schematem i danymi, jako .sql lub .sql.gz, w UTF-16 lub UTF-8, 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_sqlserver.sqlPlik przykładowy, 11 kB
Twoja baza danych

18 wierszy przekonwertowanych, 3 poprawki, brak odrzuconych

Pokaż

Tabele w pliku shop_2024_sqlserver.sqlZrzut SQL Server · zapisany przez SQL Server Management Objects · utf-8

  • orders10 wierszy1
    11 kolumn
    idint not null
    customer_idint not null
    statusvarchar(10) not null
    totaldecimal(19,4) not null
    itemstinyint unsigned not null
    ordered_atdatetime not null
    shipped_atdatetime(6)
    notetext
    detailstext
    order_refchar(36) not null
    total_with_taxdecimal(12,2)
  • customers8 wierszy2
    8 kolumn
    idint not null
    namevarchar(100) not null
    emailvarchar(200) not null
    countrychar(2) not null
    is_activetinyint(1) not null
    signed_update
    created_atdatetime not null
    row_versionblob

Nieprzekonwertowane

  • Widok paid_orders
  • Wyzwalacz orders_no_negative

Każda baza danych zapisuje je we własnym języku. Przepisz je dla MySQL.

-- Written by IntoSQL from a SQL Server 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 `orders` (
  `id` int NOT NULL AUTO_INCREMENT,
  `customer_id` int NOT NULL,
  `status` varchar(10) NOT NULL DEFAULT 'pending',
  `total` decimal(19,4) NOT NULL,
  `items` tinyint unsigned NOT NULL DEFAULT 1,
  `ordered_at` datetime NOT NULL,
  `shipped_at` datetime(6),
  `note` text,
  `details` text,
  `order_ref` char(36) NOT NULL,
  `total_with_tax` decimal(12,2) GENERATED ALWAYS AS (cast(`total` * (1.16) AS DECIMAL(12,2))) STORED,
  PRIMARY KEY (`id`),
  KEY `idx_orders_customer` (`customer_id`),
  KEY `idx_orders_status_date` (`status`,`ordered_at`),
  CONSTRAINT `check2` CHECK (`status` = 'cancelled' OR `status` = 'shipped' OR `status` = 'paid' OR `status` = 'pending'),
  CONSTRAINT `check3` CHECK (`total` >= (0)),
  FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`)
) AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

CREATE TABLE `customers` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `email` varchar(200) NOT NULL,
  `country` char(2) NOT NULL DEFAULT 'US',
  `is_active` tinyint(1) NOT NULL DEFAULT 1,
  `signed_up` date,
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `row_version` blob,
  PRIMARY KEY (`id`),
  UNIQUE KEY (`email`)
) AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='People who bought at least once';

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','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','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','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','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','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','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','2024-04-12 12:12:12.000000');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (1,1,'shipped',129.9000,3,'2024-03-01T10:00:00.000000','2024-03-02T16:30:00.123456',NULL,'{"gift": false}','0b7a4c2e-3f1d-4e8a-9c55-1a2b3c4d5e6f');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (2,2,'paid',54.0000,1,'2024-03-02T11:15:00.000000',NULL,'Gift wrap 🎁','{"gift": true, "wrap": "red"}','1c8b5d3f-4a2e-4f9b-8d66-2b3c4d5e6f70');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (3,1,'cancelled',12.5000,1,'2024-03-03T09:45:00.000000',NULL,'Customer changed their mind',NULL,'2d9c6e4a-5b3f-4a0c-9e77-3c4d5e6f7081');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (4,4,'shipped',980.0000,12,'2024-03-05T02:10:00.000000','2024-03-07T08:00:00.000000','请小心轻放','{"fragile": true}','3e0d7f5b-6c4a-4b1d-8f88-4d5e6f708192');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (5,5,'pending',45.7500,2,'2024-03-08T17:20:00.000000',NULL,'Leave at the door; ring twice',NULL,'4f1e806c-7d5b-4c2e-9a99-5e6f708192a3');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (6,6,'shipped',310.4000,5,'2024-03-10T13:00:00.000000','2024-03-11T09:00:00.000000','Fragile: "glass"','{"fragile": true}','50f2917d-8e6c-4d3f-8baa-6f708192a3b4');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (7,8,'paid',76.2000,2,'2024-03-11T18:45:00.000000',NULL,NULL,NULL,'6103a28e-9f7d-4e40-9cbb-708192a3b4c5');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (8,2,'shipped',19.9900,1,'2024-03-12T08:00:00.000000','9999-12-31T23:59:59.999999','Shipped date set to the maximum by an old import',NULL,'7214b39f-a08e-4f51-8dcc-8192a3b4c5d6');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (9,3,'shipped',64.0000,2,'2024-03-14T15:30:00.000000','2024-03-15T10:00:00.000000','Two parcels','{"parcels": [1, 2]}','8325c4a0-b19f-4062-9edd-92a3b4c5d6e7');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (10,7,'paid',1499.0000,1,'2024-03-15T21:05:00.000000',NULL,'C:\\Users\\ravi\\invoice.pdf',NULL,'9436d5b1-c2a0-4173-8fee-a3b4c5d6e7f8');

SET UNIQUE_CHECKS = 1;
SET FOREIGN_KEY_CHECKS = 1;

Poprawki

  1. "shipped_at" w tabeli orders to datetime2(7), z większą liczbą cyfr ułamka sekundy, niż zachowuje MySQL, więc ma typ datetime(6), a ostatnie cyfry są obcinane.
  2. "created_at" tabeli customers zawiera momenty ze strefą czasową; MySQL nie ma typu, który ją zachowuje, więc są zapisywane w UTC jako datetime.
  3. "row_version" w tabeli customers to wersja wiersza, którą SQL Server ustawia sam; zrzut nie ma dla niej wartości, więc ma typ blob i jest pusta.

Do sprawdzenia

  • W źródle 6 kolumn tekstowych ignoruje wielkość liter przy porównaniu; MySQL porównuje dokładnie, więc klucze unikalne i wyszukiwanie mogą działać inaczej. Użyj collation lub typu kolumny ignorującego wielkość liter w kolumnach, które tego potrzebują.
  • Widoki, wyzwalacze, procedury i zdarzenia nie są konwertowane: 2 obiekty, każdy wymieniony w raporcie. Utwórz je ręcznie w MySQL.
  • Ograniczenia CHECK check1 w tabeli orders nie da się zapisać dla MySQL (function isjson), więc go nie utworzono. Zapisz ograniczenie CHECK ręcznie, jeśli jest ważne.
  • Indeks idx_orders_pending w tabeli orders używa wyrażenia, którego nie da się zapisać dla MySQL (neither MySQL 5.7 nor MariaDB index an expression), więc go nie utworzono. Utwórz indeks ręcznie, jeśli zapytania go potrzebują.
  • Wartości domyślnej "order_ref" w tabeli orders nie da się zapisać dla MySQL (a default expression needs MySQL 8.0.13), 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 SQL Server 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.

  • bit

    tinyint(1)

    BOOLEAN w MySQL to TINYINT(1): 1 i 0, tak jak przechowuje je bit.

  • char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), text

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

    Tekst zachowuje każdy znak jako utf8mb4. Kolumna w kluczu to najwyżej varchar(768), najdłuższa, jaką mieści klucz, i tak samo tekst z wartością domyślną, którą MySQL 5.7 nadaje tylko typowi varchar.

  • decimal(p,s), money, smallmoney

    decimal(p,s); money jako decimal(19,4)

    decimal mieści 65 cyfr, więcej niż 38 w SQL Server, więc każda wartość jest dokładna.

  • datetime, datetime2, smalldatetime

    datetime(p)

    W obu bazach datetime to wskazanie zegara.

  • datetime2(7), time(7) and datetimeoffset(7)

    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

  • datetimeoffset

    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

  • time

    time(p)

    Te same godziny dnia.

  • dates before the year 1000

    NULL

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

    Wpis w raporcie: date_out_of_range

  • json (SQL Server 2025)

    json

    Te same wartości JSON, które odczytują funkcje JSON w MySQL.

  • uniqueidentifier

    char(36)

    Te same identyfikatory, zapisane małymi literami.

  • binary, varbinary, image

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

    Bajty pozostają bajtami.

  • geometry, geography

    blob z własnymi bajtami SQL Server

    SSMS zapisuje wartości przestrzenne w serializacji SQL Server, zachowywanej bajt po bajcie.

    Wpis w raporcie: spatial_as_native

  • rowversion, timestamp

    blob, pusty

    SQL Server sam ustawia wersję wiersza, a SSMS nie zapisuje dla niej wartości.

    Wpis w raporcie: rowversion_empty

  • xml, sql_variant, hierarchyid, vector

    longtext

    MySQL nie ma odpowiedniego typu; xml i sql_variant zachowują tekst każdej wartości, a hierarchyid swoją ścieżkę, np. /1/2/.

    Wpis w raporcie: type_replaced

  • collations that ignore case (_CI_)

    dokładne porównanie (utf8mb4_bin)

    Tabele używają utf8mb4_bin, więc klucze unikalne rozróżniają to, co rozróżniał SQL Server; 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 SQL Server w każdej z nich.

    Wpis w raporcie: case_insensitive_collation

  • IDENTITY

    AUTO_INCREMENT, kontynuowane po najwyższym id

    Liczy kolumna, która zaczyna klucz główny; licznik idzie dalej po najwyższym id.

  • IDENTITY columns that don't lead the primary key

    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

    MySQL nie ma sekwencji. Wartości wydane przez sekwencję są w wierszach.

    Wpis w raporcie: sequence_not_converted

  • computed columns

    kolumny generowane, STORED przy PERSISTED, w przeciwnym razie VIRTUAL

    MySQL oblicza je na te same dwa sposoby, z CONCAT zapisanym tak, by NULL liczył się jako pusty, jak w SQL Server.

  • computed columns with functions MySQL lacks

    zwykła kolumna

    Formuła, której nie da się zapisać, zostawia zwykłą kolumnę i wpis w raporcie; SSMS nie zapisuje wartości kolumn obliczanych.

    Wpis w raporcie: generated_not_translated

  • defaults with functions MySQL lacks, and NEXT VALUE FOR

    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 MySQL lacks

    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 added WITH NOCHECK or disabled

    nie jest tworzone

    SQL Server nie stosuje tych ograniczeń CHECK, więc wiersze mogą je łamać.

    Wpis w raporcie: check_not_enforced

  • filtered and columnstore 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 dump doesn't create

    nie jest tworzone

    Klucz nie może wskazywać tabeli, której nie ma.

    Wpis w raporcie: foreign_key_skipped

  • tables on a partition scheme

    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

  • temporal tables (SYSTEM_VERSIONING)

    dwie tabele: bieżące wiersze i historia

    Tabela i jej tabela historii są kopiowane jako zwykłe tabele; MySQL nie przechowuje historii sam.

    Wpis w raporcie: system_versioning_dropped

  • schemas

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

    Schematy w MySQL to bazy danych, których skrypt ładowany do jednej bazy nie może utworzyć; tabele z dbo zachowują nazwy.

    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, functions, procedures, triggers, synonyms, types and partition functions

    wymienione w raporcie

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

    Wpis w raporcie: not_converted_objects

  • scripts without CREATE TABLE (data only)

    typy odczytane z wartości

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

    Wpis w raporcie: no_schema

  • expressions in INSERT values

    NULL

    Konwerter, który nie uruchamia bazy danych, nie może ich obliczyć.

    Wpis w raporcie: expression_value

  • types IntoSQL doesn't know

    longtext

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

    Wpis w raporcie: unknown_type

  • 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 SQL ServerW MySQLWpis w raporcie
bittinyint(1)BOOLEAN w MySQL to TINYINT(1): 1 i 0, tak jak przechowuje je bit.
char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), textchar(n), varchar(n) do 1024 znaków, powyżej typy textTekst zachowuje każdy znak jako utf8mb4. Kolumna w kluczu to najwyżej varchar(768), najdłuższa, jaką mieści klucz, i tak samo tekst z wartością domyślną, którą MySQL 5.7 nadaje tylko typowi varchar.
decimal(p,s), money, smallmoneydecimal(p,s); money jako decimal(19,4)decimal mieści 65 cyfr, więcej niż 38 w SQL Server, więc każda wartość jest dokładna.
datetime, datetime2, smalldatetimedatetime(p)W obu bazach datetime to wskazanie zegara.
datetime2(7), time(7) and datetimeoffset(7)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
datetimeoffsetdatetime(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
timetime(p)Te same godziny dnia.
dates before the year 1000NULLMySQL przechowuje lata od 1000 do 9999, a SQL Server sięga do roku 1. Takie wartości stają się NULL, a raport je liczy.date_out_of_range
json (SQL Server 2025)jsonTe same wartości JSON, które odczytują funkcje JSON w MySQL.
uniqueidentifierchar(36)Te same identyfikatory, zapisane małymi literami.
binary, varbinary, imagebinary(n), varbinary(n) i typy blobBajty pozostają bajtami.
geometry, geographyblob z własnymi bajtami SQL ServerSSMS zapisuje wartości przestrzenne w serializacji SQL Server, zachowywanej bajt po bajcie.spatial_as_native
rowversion, timestampblob, pustySQL Server sam ustawia wersję wiersza, a SSMS nie zapisuje dla niej wartości.rowversion_empty
xml, sql_variant, hierarchyid, vectorlongtextMySQL nie ma odpowiedniego typu; xml i sql_variant zachowują tekst każdej wartości, a hierarchyid swoją ścieżkę, np. /1/2/.type_replaced
collations that ignore case (_CI_)dokładne porównanie (utf8mb4_bin)Tabele używają utf8mb4_bin, więc klucze unikalne rozróżniają to, co rozróżniał SQL Server; 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 SQL Server w każdej z nich.case_insensitive_collation
IDENTITYAUTO_INCREMENT, kontynuowane po najwyższym idLiczy kolumna, która zaczyna klucz główny; licznik idzie dalej po najwyższym id.
IDENTITY columns that don't lead the primary keyzwykł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 tworzoneMySQL nie ma sekwencji. Wartości wydane przez sekwencję są w wierszach.sequence_not_converted
computed columnskolumny generowane, STORED przy PERSISTED, w przeciwnym razie VIRTUALMySQL oblicza je na te same dwa sposoby, z CONCAT zapisanym tak, by NULL liczył się jako pusty, jak w SQL Server.
computed columns with functions MySQL lackszwykła kolumnaFormuła, której nie da się zapisać, zostawia zwykłą kolumnę i wpis w raporcie; SSMS nie zapisuje wartości kolumn obliczanych.generated_not_translated
defaults with functions MySQL lacks, and NEXT VALUE FORbrak 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 MySQL lacksnie jest tworzoneOgraniczenie CHECK, którego nie da się zapisać, jest pomijane i zgłaszane w raporcie.check_skipped
CHECK constraints added WITH NOCHECK or disablednie jest tworzoneSQL Server nie stosuje tych ograniczeń CHECK, więc wiersze mogą je łamać.check_not_enforced
filtered and columnstore 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 dump doesn't createnie jest tworzoneKlucz nie może wskazywać tabeli, której nie ma.foreign_key_skipped
tables on a partition schemejedna tabela z wierszami wszystkich partycjiWiersze są te same; jeśli trzeba, podziel tabelę na partycje ponownie w MySQL.partitions_dropped
temporal tables (SYSTEM_VERSIONING)dwie tabele: bieżące wiersze i historiaTabela i jej tabela historii są kopiowane jako zwykłe tabele; MySQL nie przechowuje historii sam.system_versioning_dropped
schemasjedna baza danych, nazwa każdej tabeli zaczyna się od nazwy jej schematuSchematy w MySQL to bazy danych, których skrypt ładowany do jednej bazy nie może utworzyć; tabele z dbo zachowują nazwy.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, functions, procedures, triggers, synonyms, types and partition functionswymienione w raporcieIch kod jest napisany w T-SQL, więc trafiają na listę do ręcznego odtworzenia.not_converted_objects
scripts without CREATE TABLE (data only)typy odczytane z wartościSkrypt samych danych zawiera tylko wiersze, więc typy pochodzą z wartości.no_schema
expressions in INSERT valuesNULLKonwerter, który nie uruchamia bazy danych, nie może ich obliczyć.expression_value
types IntoSQL doesn't knowlongtextTekst mieści każdą wartość; zmień typ po załadowaniu.unknown_type
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 < sql_server.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 SQL Server dla najlepszego wyniku

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

  • W SSMS kliknij prawym przyciskiem bazę danych, Tasks, Generate Scripts i wybierz tabele. dbatools, mssql-scripter i inne narzędzia oparte na tej samej bibliotece zapisują taki sam skrypt.
  • W sekcji Advanced ustaw Types of data to script na Schema and data. Skrypt samego schematu ma tabele bez wierszy.
  • Zapisz go jako Unicode, domyślnie w SSMS, lub jako UTF-8: oba są czytane tak samo, a gzip też działa.

Co nie jest konwertowane

Widoki, funkcje, procedury, wyzwalacze, synonimy, reguły i polityki bezpieczeństwa są pisane w T-SQL. Raport wymienia je z nazwy i nigdy nie pomija ich po cichu, więc możesz je przepisać dla MySQL.

Pytania o konwersję SQL Server 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 odczytuje plik UTF-16 zapisany przez SSMS?

Tak. SSMS domyślnie zapisuje skrypty jako UTF-16, a konwerter czyta UTF-16 i UTF-8 tak samo, spakowane gzip lub nie, z GO między partiami.

Z jakich wersji SQL Server może pochodzić skrypt?

Skrypty zapisane przez SSMS, dbatools lub mssql-scripter z SQL Server od wersji 2017. Każdy testowy skrypt pochodzi z SQL Server 2017, 2022 i 2025 i jest porównywany ze źródłem komórka po komórce.

Czy wartości IDENTITY są zachowywane?

Tak, dla jednej kolumny na tabelę: kolumna IDENTITY, która zaczyna klucz główny, staje się AUTO_INCREMENT i idzie dalej po najwyższym id. Sekwencje nie są tworzone, bo MySQL ich nie ma, a raport o tym mówi.

Co dzieje się z money, datetimeoffset i innymi typami SQL Server?

bit staje się tinyint(1), money decimal(19,4), uniqueidentifier char(36), a datetimeoffset datetime w UTC. Schematy stają się prefiksami nazw tabel w jednej bazie danych. Kolumny, które ignorowały wielkość liter, porównują dokładnie, a raport podaje, których to dotyczy.

A procedury, wyzwalacze i widoki?

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 skrypt ładuje się na 5.7 i 9 i zatrzymuje przy pierwszym błędzie, jeśli coś pójdzie nie tak.