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

Konwertuj MySQL do SQL Server

Upuść zrzut z mysqldump, mariadb-dump, mysqlpump, phpMyAdmin lub Adminer jako .sql lub .sql.gz i pobierz skrypt SQL Server z tymi samymi tabelami, kluczami, indeksami i danymi. Każda wartość, której SQL Server 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, 10 poprawek, brak odrzuconych

Pokaż

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

  • customers8 wierszy4
    7 kolumn
    idbigint not null
    namenvarchar(200) not null
    emailnvarchar(150) not null
    countrynvarchar(2) not null
    is_activebit not null
    signed_update
    created_atdatetimeoffset(0) not null
  • orders10 wierszy6
    9 kolumn
    idbigint not null
    customer_idbigint not null
    statusnvarchar(9) not null
    totaldecimal(10,2) not null
    itemsint not null
    ordered_atdatetime2(0) not null
    shipped_atdatetime2(0)
    notenvarchar(510)
    updated_atdatetimeoffset(0) not null
-- Written by IntoSQL from a MySQL dump. Load it with: sqlcmd -b -f 65001 -d <database> -i <file>
SET NOCOUNT ON;
SET ANSI_NULLS ON;
SET QUOTED_IDENTIFIER ON;
SET ANSI_PADDING ON;
SET ANSI_WARNINGS ON;
SET ARITHABORT ON;
SET CONCAT_NULL_YIELDS_NULL ON;
SET NUMERIC_ROUNDABORT OFF;
GO

CREATE TABLE [dbo].[customers] (
    [id] bigint IDENTITY(1001, 1) NOT NULL,
    [name] nvarchar(200) NOT NULL,
    [email] nvarchar(150) NOT NULL,
    [country] nvarchar(2) DEFAULT N'US' NOT NULL,
    [is_active] bit DEFAULT 1 NOT NULL,
    [signed_up] date NULL,
    [created_at] datetimeoffset(0) DEFAULT SYSDATETIMEOFFSET() NOT NULL,
    CONSTRAINT [CK_customers_id] CHECK ([id] >= 0),
    CONSTRAINT [PK_customers] PRIMARY KEY ([id])
);
GO

CREATE TABLE [dbo].[orders] (
    [id] bigint IDENTITY(5001, 1) NOT NULL,
    [customer_id] bigint NOT NULL,
    [status] nvarchar(9) DEFAULT N'pending' NOT NULL,
    [total] decimal(10,2) NOT NULL,
    [items] int DEFAULT 1 NOT NULL,
    [ordered_at] datetime2(0) NOT NULL,
    [shipped_at] datetime2(0) NULL,
    [note] nvarchar(510) NULL,
    [updated_at] datetimeoffset(0) DEFAULT SYSDATETIMEOFFSET() 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 (N'pending', N'paid', N'shipped', N'cancelled', N'')),
    CONSTRAINT [CK_orders_items] CHECK ([items] >= 0),
    CONSTRAINT [PK_orders] PRIMARY KEY ([id])
);
GO

SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(1,N'Ana Martínez',N'ana@example.com',N'MX',1,'2023-01-15','2023-01-15 10:24:00+00:00'),
(2,N'Zoë Müller',N'zoe@example.de',N'DE',1,'2023-02-03','2023-02-03 08:11:42+00:00'),
(3,N'José Peña',N'jose@example.es',N'ES',0,'2023-03-21','2023-03-21 19:05:17+00:00'),
(4,N'李雷',N'lilei@example.cn',N'CN',1,'2023-05-09','2023-05-09 02:40:00+00:00'),
(5,N'Noah O''Brien',N'noah@example.ie',N'IE',1,NULL,'2023-06-30 14:00:00+00:00'),
(6,N'Amélie Laurent',N'amelie@example.fr',N'FR',1,'2024-01-02','2024-01-02 09:30:00+00:00'),
(7,N'Ravi Patel',N'ravi@example.in',N'IN',0,'2024-02-29','2024-02-29 23:59:59+00:00'),
(8,N'Sofia Rossi 🌻',N'sofia@example.it',N'IT',1,'2024-04-12','2024-04-12 12:12:12+00:00');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [updated_at]) VALUES
(1,1,N'shipped',129.90,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,'2024-03-02 16:30:00+00:00'),
(2,2,N'paid',54.00,1,'2024-03-02 11:15:00',NULL,N'Gift wrap 🎁','2024-03-02 11:20:00+00:00'),
(3,1,N'cancelled',12.50,1,'2024-03-03 09:45:00',NULL,N'Customer changed their mind','2024-03-03 10:00:00+00:00'),
(4,4,N'shipped',980.00,12,'2024-03-05 02:10:00','2024-03-07 08:00:00',N'请小心轻放','2024-03-07 08:00:00+00:00'),
(5,5,N'pending',45.75,2,'2024-03-08 17:20:00',NULL,N'Leave at the door; ring twice','2024-03-08 17:20:00+00:00'),
(6,6,N'shipped',310.40,5,'2024-03-10 13:00:00','2024-03-11 09:00:00',N'Fragile: "glass"','2024-03-11 09:00:00+00:00'),
(7,8,N'paid',76.20,2,'2024-03-11 18:45:00',NULL,NULL,'2024-03-11 18:46:00+00:00'),
(8,2,N'',19.99,1,'2024-03-12 08:00:00',NULL,N'Status lost in an old import','2024-03-12 08:00:00+00:00'),
(9,3,N'shipped',64.00,2,'2024-03-14 15:30:00',NULL,N'Shipping date never recorded','2024-03-15 10:00:00+00:00'),
(10,7,N'paid',1499.00,1,'2024-03-15 21:05:00',NULL,N'C:\Users\ravi\invoice.pdf','2024-03-15 21:05:00+00:00');
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO

-- Indexes, foreign keys, counters and triggers, after the rows.
CREATE UNIQUE INDEX [uq_email] ON [dbo].[customers] ([email]);
CREATE INDEX [idx_customer] ON [dbo].[orders] ([customer_id]);
CREATE INDEX [idx_status_date] ON [dbo].[orders] ([status], [ordered_at]);
ALTER TABLE [dbo].[orders] WITH NOCHECK ADD CONSTRAINT [fk_orders_customer] FOREIGN KEY ([customer_id]) REFERENCES [dbo].[customers] ([id]);
BEGIN TRY ALTER TABLE [dbo].[orders] WITH CHECK CHECK CONSTRAINT [fk_orders_customer]; END TRY BEGIN CATCH PRINT N'Foreign key ' + N'[fk_orders_customer]' + N' has rows without a parent: it stays unchecked, and new rows are checked.'; END CATCH;
DECLARE @next decimal(38,0) = (SELECT MAX([id]) FROM [dbo].[customers]); IF @next IS NOT NULL BEGIN IF @next < 1000 SET @next = 1000; DBCC CHECKIDENT (N'[dbo].[customers]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = N'People who bought at least once', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'customers';
DECLARE @next decimal(38,0) = (SELECT MAX([id]) FROM [dbo].[orders]); IF @next IS NOT NULL BEGIN IF @next < 5000 SET @next = 5000; DBCC CHECKIDENT (N'[dbo].[orders]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
GO
CREATE TRIGGER [dbo].[TR_orders_updated_at_on_update] ON [dbo].[orders] AFTER UPDATE AS
BEGIN
    SET NOCOUNT ON;
    IF NOT UPDATE([updated_at])
        UPDATE x SET [updated_at] = SYSDATETIMEOFFSET() FROM [dbo].[orders] AS x JOIN inserted AS i ON x.[id] = i.[id];
END;
GO
GO

Poprawki

  1. "id" w tabeli customers jest bez znaku, więc ma typ bigint z ograniczeniem CHECK, że nie jest ujemna.
  2. "name" w tabeli customers zawiera znaki, które SQL Server liczy podwójnie, np. emoji, więc ma typ nvarchar(200).
  3. "signed_up" w tabeli customers dopuszcza teraz NULL: części jej wartości nie dało się zapisać i są NULL.
  4. Wartość domyślna "signed_up" w tabeli customers, 0000‑00‑00, nie jest datą akceptowaną przez SQL Server, więc kolumna nie ma wartości domyślnej.
  5. "customer_id" w tabeli orders jest bez znaku, więc ma typ bigint z ograniczeniem CHECK, że nie jest ujemna.
  6. "id" w tabeli orders jest bez znaku, więc ma typ bigint z ograniczeniem CHECK, że nie jest ujemna.
  7. "items" w tabeli orders jest bez znaku, więc ma typ int z ograniczeniem CHECK, że nie jest ujemna.
  8. "note" w tabeli orders zawiera znaki, które SQL Server liczy podwójnie, np. emoji, więc ma typ nvarchar(510).
  9. W "status" tabeli orders 1 wiersz zawiera pustą wartość, którą MySQL zapisuje dla błędnych danych; ograniczenie CHECK kolumny ją dopuszcza.
  10. "updated_at" w tabeli orders zmienia się na bieżący czas przy każdej aktualizacji; w SQL Server 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 SQL Server 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 SQL Server nie zapisuje takich dat. Jeśli te daty coś znaczą, zastąp je w źródle prawdziwymi, zanim zrobisz zrzut.

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

Inne przykłady:

Co zmienia się między MySQL a SQL Server

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

    bit, gdy każda wartość to 0 lub 1, w przeciwnym razie smallint

    BOOL w MySQL to TINYINT(1), który mieści dowolną liczbę od -128 do 127. Kolumna z samymi 0 i 1 staje się bit; kolumna z 2 lub -1 pozostaje liczbą, aby żadna wartość nie zmieniła znaczenia.

    Wpis w raporcie: bool_kept_numeric

  • UNSIGNED integers

    TINYINT UNSIGNED jako tinyint; pozostałe jako następny szerszy typ całkowity z CHECK, że wartość nie jest ujemna, BIGINT UNSIGNED jako bigint, gdy każda wartość się mieści, w przeciwnym razie decimal(38,0)

    SQL Server nie ma liczb całkowitych bez znaku poza tinyint, który ma zakres od 0 do 255. Szerszy typ mieści cały zakres bez znaku, a ograniczenie CHECK blokuje wartości ujemne, tak jak MySQL.

    Wpis w raporcie: unsigned_widened

  • 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)

    real lub float, bez skali

    Liczby zmiennoprzecinkowe w SQL Server nie mają stałej skali. Zapisane wartości są kopiowane bez zmian.

    Wpis w raporcie: float_scale_dropped

  • DECIMAL(p,s)

    decimal(p,s) do 38 cyfr; powyżej nvarchar

    decimal w SQL Server 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)

    bit; bigint do 63 bitów; decimal(20,0) dla BIT(64)

    Pojedynczy bit to tak lub nie; szersze pola bitowe są zapisywane jako liczba, którą tworzą ich bity.

  • zero, partial or impossible dates (0000-00-00, 2024-02-30)

    NULL

    SQL Server 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, nie może zachować NOT NULL, bo ładowanie by się zatrzymało.

    Wpis w raporcie: not_null_relaxed

  • DEFAULT '0000-00-00'

    brak wartości domyślnej

    Wartość domyślna, której SQL Server nie może zapisać, jest pomijana, a nie zastępowana zmyśloną datą.

    Wpis w raporcie: zero_date_default

  • TIME

    time, gdy każda wartość mieści się w dobie, w przeciwnym razie nvarchar

    TIME w MySQL to czas trwania od -838:59:59 do 838:59:59; time w SQL Server to godzina dnia. Kolumna z dłuższymi lub ujemnymi wartościami zachowuje je jako tekst.

    Wpis w raporcie: time_as_interval

  • YEAR

    smallint z CHECK zakresu

    SQL Server nie ma typu roku; ograniczenie CHECK zachowuje te same wartości, na które pozwala MySQL.

  • CHAR(n), VARCHAR(n)

    nvarchar(n)

    nvarchar mieści każdy znak w każdej obsługiwanej wersji, a MySQL zwraca wartości CHAR bez końcowych spacji, tak jak zachowuje je nvarchar.

  • text with characters past U+FFFF (emoji) in VARCHAR(n)

    nvarchar(2n) lub nvarchar(max) powyżej 4000

    nvarchar liczy jednostki UTF-16, a emoji zajmuje dwie, więc kolumna dostaje miejsce na każdą wartość.

    Wpis w raporcie: text_length_widened

  • DATETIME

    datetime2

    DATETIME to wskazanie zegara bez strefy czasowej, jak datetime2.

  • TIMESTAMP

    datetimeoffset w strefie czasowej 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

    nvarchar z CHECK dozwolonych wartości

    Tekst z ograniczeniem CHECK zachowuje te same wartości.

  • ENUM holding '' (MySQL's error value)

    pusta wartość dopuszczona przez CHECK

    MySQL zapisuje pusty ciąg, gdy w łagodnym trybie SQL do ENUM trafia błędna wartość. Te wiersze są zachowywane, a ograniczenie CHECK je dopuszcza.

    Wpis w raporcie: enum_invalid_value

  • 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

    nvarchar w zapisie MySQL ('a,b')

    SQL Server nie ma tablic; tekst jest taki, jaki zwraca MySQL.

  • JSON

    nvarchar(max)

    Funkcje JSON w SQL Server odczytują JSON z tekstu. Ograniczenie ISJSON przed SQL Server 2022 odrzuciłoby wartości skalarne, takie jak 1 lub "x", które MySQL zachowuje.

  • NUL bytes in text

    zachowane

    nvarchar może 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 nvarchar.

    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

    IDENTITY, z licznikiem ustawionym za skopiowanymi id

    Skopiowane id ładują się z IDENTITY_INSERT, 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; SQL Server ma jeden licznik na tabelę.

    Wpis w raporcie: myisam_group_autoincrement

  • ON UPDATE CURRENT_TIMESTAMP

    wyzwalacz AFTER UPDATE

    Wyzwalacz ustawia kolumnę na bieżący czas, gdy aktualizacja jej nie ustawia. Łączy wiersze po kluczu głównym, więc tabela musi go mieć.

    Wpis w raporcie: on_update_trigger

  • ON UPDATE CURRENT_TIMESTAMP on a table without a primary key

    nie jest przenoszone

    Wyzwalacz znajduje zaktualizowane wiersze po kluczu głównym; bez niego nie może.

    Wpis w raporcie: on_update_without_key

  • generated columns

    kolumny obliczane, PERSISTED, gdy źródło je przechowuje

    SQL Server oblicza je na te same dwa sposoby.

  • generated columns with functions SQL Server lacks

    zwykła kolumna

    Formuła, której nie da się zapisać dla SQL Server, zostawia zwykłą kolumnę i wpis w raporcie.

    Wpis w raporcie: generated_not_translated

  • INVISIBLE columns

    zwykłe kolumny

    SQL Server nie ma niewidocznych kolumn.

    Wpis w raporcie: invisible_column

  • CHECK constraints

    przetłumaczone, wewnątrz CREATE TABLE

    CHECK w definicji tabeli działa przy ładowaniu każdego wiersza.

  • CHECK constraints with functions SQL Server lacks

    nie jest tworzone

    Ograniczenie CHECK, którego nie da się zapisać dla SQL Server, 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 SQL Server lacks

    brak wartości domyślnej

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

    Wpis w raporcie: default_not_translated

  • keys and indexes on a prefix, c(20)

    indeks na całej kolumnie

    SQL Server indeksuje całe kolumny; klucz unikalny na prefiksie jest też unikalny na całej kolumnie, więc każdy wiersz się ładuje.

    Wpis w raporcie: prefix_whole_column

  • FULLTEXT indexes

    nie jest tworzone

    Wyszukiwanie pełnotekstowe w SQL Server wymaga katalogu i własnych zapytań.

    Wpis w raporcie: fulltext_not_created

  • SPATIAL indexes

    nie jest tworzone

    Indeks przestrzenny na kolumnie geometry wymaga prostokąta ograniczającego, którego zrzut nie podaje.

    Wpis w raporcie: spatial_index_not_created

  • functional indexes, and indexes on columns of unlimited length

    nie jest tworzony

    SQL Server nie indeksuje wyrażeń ani kolumn nvarchar(max) i varbinary(max).

    Wpis w raporcie: index_skipped

  • foreign keys

    po danych z WITH NOCHECK, potem sprawdzany 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 jest tworzony najpierw i sprawdzany na końcu; osierocone wiersze zostawiają go niesprawdzonym z ostrzeżeniem, zamiast zatrzymać ładowanie.

  • ON DELETE or ON UPDATE that cascades in a cycle or along a second path

    NO ACTION

    SQL Server odrzuca kaskady, które mogłyby dotrzeć do tabeli dwa razy; MySQL na nie pozwala.

    Wpis w raporcie: foreign_key_action_dropped

  • foreign keys to columns without a unique key

    nie jest tworzony

    SQL Server wymaga klucza głównego lub unikalnego indeksu bez NULL na kolumnach, do których się odwołuje; InnoDB nie.

    Wpis w raporcie: foreign_key_skipped

  • table and column names

    jak w źródle; zmienione, gdy różnią się tylko wielkością liter

    Nazwy w SQL Server ignorują wielkość liter przy zwykłym porównywaniu.

    Wpis w raporcie: identifier_renamed

  • names over 116 characters

    skrócone

    Nazwy w SQL Server mają do 128 znaków, a część z nich zajmują liczby, które odróżniają nazwy od siebie.

    Wpis w raporcie: name_shortened

  • GEOMETRY, POINT, POLYGON...

    geometry, z SRID każdej wartości

    Własny typ geometry w SQL Server zachowuje każdy kształt i jego układ odniesienia przestrzennego.

  • INET4, INET6, UUID (MariaDB)

    nvarchar(39), uniqueidentifier

    uniqueidentifier to UUID w SQL Server; adresy są zapisywane jako tekst.

  • BINARY, VARBINARY, BLOB

    binary, varbinary, varbinary(max)

    Bajty pozostają bajtami.

  • PARTITION BY

    jedna tabela

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

    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

    SQL Server 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

    geometry

    Format geometrii MySQL jest rozpoznawany po wartościach.

  • _ci collations

    porównywanie bazy danych, zwykle bez rozróżniania wielkości liter

    SQL Server przy zwykłym porównywaniu porównuje tekst bez rozróżniania wielkości liter, jak _ci w MySQL.

  • 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

    nvarchar(max)

    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

  • CREATE SEQUENCE (MariaDB)

    CREATE SEQUENCE ... AS bigint, z następną wartością

    SQL Server ma sekwencje z tymi samymi opcjami; każda idzie dalej od miejsca, w którym zostawił ją zrzut.

  • VECTOR(n) (MariaDB 11.7+)

    nvarchar(max) z liczbami float jako tablicą JSON

    Tylko SQL Server 2025 ma typ wektorowy; tablica JSON zachowuje każdą liczbę float w każdej wersji.

    Wpis w raporcie: type_replaced

W MySQLW SQL ServerWpis w raporcie
TINYINT(1), BOOLbit, gdy każda wartość to 0 lub 1, w przeciwnym razie smallintBOOL w MySQL to TINYINT(1), który mieści dowolną liczbę od -128 do 127. Kolumna z samymi 0 i 1 staje się bit; kolumna z 2 lub -1 pozostaje liczbą, aby żadna wartość nie zmieniła znaczenia.bool_kept_numeric
UNSIGNED integersTINYINT UNSIGNED jako tinyint; pozostałe jako następny szerszy typ całkowity z CHECK, że wartość nie jest ujemna, BIGINT UNSIGNED jako bigint, gdy każda wartość się mieści, w przeciwnym razie decimal(38,0)SQL Server nie ma liczb całkowitych bez znaku poza tinyint, który ma zakres od 0 do 255. Szerszy typ mieści cały zakres bez znaku, a ograniczenie CHECK blokuje wartości ujemne, tak jak MySQL.unsigned_widened
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)real lub float, bez skaliLiczby zmiennoprzecinkowe w SQL Server nie mają stałej skali. Zapisane wartości są kopiowane bez zmian.float_scale_dropped
DECIMAL(p,s)decimal(p,s) do 38 cyfr; powyżej nvarchardecimal w SQL Server 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)bit; bigint do 63 bitów; decimal(20,0) dla BIT(64)Pojedynczy bit to tak lub nie; szersze pola bitowe są zapisywane jako liczba, którą tworzą ich bity.
zero, partial or impossible dates (0000-00-00, 2024-02-30)NULLSQL Server 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, nie może zachować NOT NULL, bo ładowanie by się zatrzymało.not_null_relaxed
DEFAULT '0000-00-00'brak wartości domyślnejWartość domyślna, której SQL Server nie może zapisać, jest pomijana, a nie zastępowana zmyśloną datą.zero_date_default
TIMEtime, gdy każda wartość mieści się w dobie, w przeciwnym razie nvarcharTIME w MySQL to czas trwania od -838:59:59 do 838:59:59; time w SQL Server to godzina dnia. Kolumna z dłuższymi lub ujemnymi wartościami zachowuje je jako tekst.time_as_interval
YEARsmallint z CHECK zakresuSQL Server nie ma typu roku; ograniczenie CHECK zachowuje te same wartości, na które pozwala MySQL.
CHAR(n), VARCHAR(n)nvarchar(n)nvarchar mieści każdy znak w każdej obsługiwanej wersji, a MySQL zwraca wartości CHAR bez końcowych spacji, tak jak zachowuje je nvarchar.
text with characters past U+FFFF (emoji) in VARCHAR(n)nvarchar(2n) lub nvarchar(max) powyżej 4000nvarchar liczy jednostki UTF-16, a emoji zajmuje dwie, więc kolumna dostaje miejsce na każdą wartość.text_length_widened
DATETIMEdatetime2DATETIME to wskazanie zegara bez strefy czasowej, jak datetime2.
TIMESTAMPdatetimeoffset w strefie czasowej 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
ENUMnvarchar z CHECK dozwolonych wartościTekst z ograniczeniem CHECK zachowuje te same wartości.
ENUM holding '' (MySQL's error value)pusta wartość dopuszczona przez CHECKMySQL zapisuje pusty ciąg, gdy w łagodnym trybie SQL do ENUM trafia błędna wartość. Te wiersze są zachowywane, a ograniczenie CHECK je dopuszcza.enum_invalid_value
ENUM holding values outside its listbez CHECKWartości spoza listy nie przeszłyby ograniczenia CHECK, więc nie jest ono tworzone.enum_check_skipped
SETnvarchar w zapisie MySQL ('a,b')SQL Server nie ma tablic; tekst jest taki, jaki zwraca MySQL.
JSONnvarchar(max)Funkcje JSON w SQL Server odczytują JSON z tekstu. Ograniczenie ISJSON przed SQL Server 2022 odrzuciłoby wartości skalarne, takie jak 1 lub "x", które MySQL zachowuje.
NUL bytes in textzachowanenvarchar może 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 nvarchar.invalid_utf8_replaced
text decoded twice (ñ)skopiowane bez zmianZrzut zawiera dokładnie te znaki, więc są kopiowane; raport je wskazuje.mojibake_suspected
AUTO_INCREMENTIDENTITY, z licznikiem ustawionym za skopiowanymi idSkopiowane id ładują się z IDENTITY_INSERT, 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; SQL Server ma jeden licznik na tabelę.myisam_group_autoincrement
ON UPDATE CURRENT_TIMESTAMPwyzwalacz AFTER UPDATEWyzwalacz ustawia kolumnę na bieżący czas, gdy aktualizacja jej nie ustawia. Łączy wiersze po kluczu głównym, więc tabela musi go mieć.on_update_trigger
ON UPDATE CURRENT_TIMESTAMP on a table without a primary keynie jest przenoszoneWyzwalacz znajduje zaktualizowane wiersze po kluczu głównym; bez niego nie może.on_update_without_key
generated columnskolumny obliczane, PERSISTED, gdy źródło je przechowujeSQL Server oblicza je na te same dwa sposoby.
generated columns with functions SQL Server lackszwykła kolumnaFormuła, której nie da się zapisać dla SQL Server, zostawia zwykłą kolumnę i wpis w raporcie.generated_not_translated
INVISIBLE columnszwykłe kolumnySQL Server nie ma niewidocznych kolumn.invisible_column
CHECK constraintsprzetłumaczone, wewnątrz CREATE TABLECHECK w definicji tabeli działa przy ładowaniu każdego wiersza.
CHECK constraints with functions SQL Server lacksnie jest tworzoneOgraniczenie CHECK, którego nie da się zapisać dla SQL Server, 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 SQL Server lacksbrak wartości domyślnejWartość domyślna, której nie da się zapisać dla SQL Server, jest pomijana i zgłaszana w raporcie.default_not_translated
keys and indexes on a prefix, c(20)indeks na całej kolumnieSQL Server indeksuje całe kolumny; klucz unikalny na prefiksie jest też unikalny na całej kolumnie, więc każdy wiersz się ładuje.prefix_whole_column
FULLTEXT indexesnie jest tworzoneWyszukiwanie pełnotekstowe w SQL Server wymaga katalogu i własnych zapytań.fulltext_not_created
SPATIAL indexesnie jest tworzoneIndeks przestrzenny na kolumnie geometry wymaga prostokąta ograniczającego, którego zrzut nie podaje.spatial_index_not_created
functional indexes, and indexes on columns of unlimited lengthnie jest tworzonySQL Server nie indeksuje wyrażeń ani kolumn nvarchar(max) i varbinary(max).index_skipped
foreign keyspo danych z WITH NOCHECK, potem sprawdzany 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 jest tworzony najpierw i sprawdzany na końcu; osierocone wiersze zostawiają go niesprawdzonym z ostrzeżeniem, zamiast zatrzymać ładowanie.
ON DELETE or ON UPDATE that cascades in a cycle or along a second pathNO ACTIONSQL Server odrzuca kaskady, które mogłyby dotrzeć do tabeli dwa razy; MySQL na nie pozwala.foreign_key_action_dropped
foreign keys to columns without a unique keynie jest tworzonySQL Server wymaga klucza głównego lub unikalnego indeksu bez NULL na kolumnach, do których się odwołuje; InnoDB nie.foreign_key_skipped
table and column namesjak w źródle; zmienione, gdy różnią się tylko wielkością literNazwy w SQL Server ignorują wielkość liter przy zwykłym porównywaniu.identifier_renamed
names over 116 charactersskróconeNazwy w SQL Server mają do 128 znaków, a część z nich zajmują liczby, które odróżniają nazwy od siebie.name_shortened
GEOMETRY, POINT, POLYGON...geometry, z SRID każdej wartościWłasny typ geometry w SQL Server zachowuje każdy kształt i jego układ odniesienia przestrzennego.
INET4, INET6, UUID (MariaDB)nvarchar(39), uniqueidentifieruniqueidentifier to UUID w SQL Server; adresy są zapisywane jako tekst.
BINARY, VARBINARY, BLOBbinary, varbinary, varbinary(max)Bajty pozostają bajtami.
PARTITION BYjedna tabelaWiersze są te same; jeśli trzeba, podziel tabelę na partycje ponownie w SQL Server.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 tabelaSQL Server 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 TABLEgeometryFormat geometrii MySQL jest rozpoznawany po wartościach.
_ci collationsporównywanie bazy danych, zwykle bez rozróżniania wielkości literSQL Server przy zwykłym porównywaniu porównuje tekst bez rozróżniania wielkości liter, jak _ci w MySQL.
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 knownvarchar(max)Tekst 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
CREATE SEQUENCE (MariaDB)CREATE SEQUENCE ... AS bigint, z następną wartościąSQL Server ma sekwencje z tymi samymi opcjami; każda idzie dalej od miejsca, w którym zostawił ją zrzut.
VECTOR(n) (MariaDB 11.7+)nvarchar(max) z liczbami float jako tablicą JSONTylko SQL Server 2025 ma typ wektorowy; tablica JSON zachowuje każdą liczbę float w każdej wersji.type_replaced

Załaduj skrypt do SQL Server

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

sqlcmd -b -f 65001 -S localhost -d mydb -i mysql.sql_server.sql

Klucze obce są dodawane z WITH NOCHECK, a potem sprawdzane. Jeśli wiersz wskazuje na nieistniejący wiersz, skrypt podaje, którego ograniczenia to dotyczy, i zostawia je niesprawdzone, zamiast przerwać w połowie.

Przy dużym zrzucie uruchom sqlcmd na tej samej maszynie co serwer. Każda partia do 1000 wierszy jest zatwierdzana osobno, więc dziennik transakcji pozostaje mały.

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 SQL Server.

Pytania o konwersję MySQL do SQL Server

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?

SQL Server nie ma daty zerowej, więc stają się NULL, a kolumna przyjmuje NULL. Raport podaje, ile ich było w każdej kolumnie.

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?

Staje się bit tylko wtedy, gdy każda wartość w kolumnie to 0 lub 1. Jeśli zawiera inne liczby, np. 2 lub -1, pozostaje liczbą, a raport wyjaśnia dlaczego, więc żadna wartość nie zmieni się przypadkiem w 1.

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 SQL Server.

Na jakich wersjach SQL Server ładuje się skrypt?

SQL Server od 2017 do 2025. Ten sam skrypt ładuje się na każdej z nich i zatrzymuje przy pierwszym błędzie, jeśli coś pójdzie nie tak.