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

Konwertuj SQL Server do MariaDB

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 MariaDB z tymi samymi tabelami, kluczami, indeksami i danymi. Każda wartość, której MariaDB 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_refuuid 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 MariaDB.

-- Written by IntoSQL from a SQL Server dump. Load it with: mariadb --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` uuid NOT NULL DEFAULT (uuid()),
  `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 MariaDB, więc ma typ datetime(6), a ostatnie cyfry są obcinane.
  2. "created_at" tabeli customers zawiera momenty ze strefą czasową; MariaDB 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; MariaDB 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 MariaDB.
  • Ograniczenia CHECK check1 w tabeli orders nie da się zapisać dla MariaDB (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 MariaDB (neither MySQL 5.7 nor MariaDB index an expression), więc go nie utworzono. Utwórz indeks ręcznie, jeśli zapytania go potrzebują.

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

Inne przykłady:

Co zmienia się między SQL Server a MariaDB

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 MariaDB 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.

  • 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

    MariaDB 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 MariaDB 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

    MariaDB 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, longtext ze sprawdzeniem JSON

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

  • uniqueidentifier

    uuid

    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

    MariaDB 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

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

    Wpis w raporcie: counter_dropped

  • CREATE SEQUENCE

    CREATE SEQUENCE z tymi samymi opcjami

    Sekwencje w MariaDB działają tak samo. SSMS nie zapisuje, dokąd doszła sekwencja, więc zaczyna ona od wartości, od której została utworzona.

  • computed columns

    kolumny generowane, STORED przy PERSISTED, w przeciwnym razie VIRTUAL

    MariaDB 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 MariaDB 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 MariaDB 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

    Te same ograniczenia CHECK, sprawdzane przy ładowaniu każdego wiersza.

  • CHECK constraints with functions MariaDB 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 MariaDB.

    Wpis w raporcie: partitions_dropped

  • temporal tables (SYSTEM_VERSIONING)

    WITH SYSTEM VERSIONING, od bieżących wierszy; tabela historii jako zwykła tabela

    MariaDB od teraz sama przechowuje historię; kolumny okresu i tabela historii z SQL Server są kopiowane bez zmian.

  • schemas

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

    Schematy w MariaDB 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 MariaDBWpis w raporcie
bittinyint(1)BOOLEAN w MariaDB 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.
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ętaMariaDB 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 MariaDB 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 1000NULLMariaDB 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)json, longtext ze sprawdzeniem JSONTe same wartości JSON, które odczytują funkcje JSON w MariaDB.
uniqueidentifieruuidTe 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, vectorlongtextMariaDB 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łkowitaMariaDB liczy jedną kolumnę na tabelę, na początku klucza; każda inna zachowuje wartości bez licznika.counter_dropped
CREATE SEQUENCECREATE SEQUENCE z tymi samymi opcjamiSekwencje w MariaDB działają tak samo. SSMS nie zapisuje, dokąd doszła sekwencja, więc zaczyna ona od wartości, od której została utworzona.
computed columnskolumny generowane, STORED przy PERSISTED, w przeciwnym razie VIRTUALMariaDB 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 MariaDB 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 MariaDB 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łumaczoneTe same ograniczenia CHECK, sprawdzane przy ładowaniu każdego wiersza.
CHECK constraints with functions MariaDB 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 MariaDB.partitions_dropped
temporal tables (SYSTEM_VERSIONING)WITH SYSTEM VERSIONING, od bieżących wierszy; tabela historii jako zwykła tabelaMariaDB od teraz sama przechowuje historię; kolumny okresu i tabela historii z SQL Server są kopiowane bez zmian.
schemasjedna baza danych, nazwa każdej tabeli zaczyna się od nazwy jej schematuSchematy w MariaDB 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 MariaDB

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

mariadb --default-character-set=utf8mb4 mydb < sql_server.mariadb.sql

Klucze obce są tworzone tak, jak deklaruje je zrzut, z FOREIGN_KEY_CHECKS=0 podczas ładowania wierszy, tak jak robi to mysqldump.

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 MariaDB 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 MariaDB.

Pytania o konwersję SQL Server do MariaDB

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 stają się sekwencjami MariaDB z tymi samymi opcjami.

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

bit staje się tinyint(1), money decimal(19,4), uniqueidentifier UUID, a datetimeoffset datetime w UTC. Tabele temporalne zachowują wersjonowanie systemowe. 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 MariaDB ładuje się skrypt?

MariaDB 10.11 i nowsze. Każdy testowy skrypt ładuje się na 10.11 i 11.4 i zatrzymuje przy pierwszym błędzie, jeśli coś pójdzie nie tak.