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.
18 wierszy przekonwertowanych, 3 poprawki, brak odrzuconych
Tabele w pliku shop_2024_sqlserver.sqlZrzut SQL Server · zapisany przez SQL Server Management Objects · utf-8
orders10 wierszy1
11 kolumn id int not null customer_id int not null status varchar(10) not null total decimal(19,4) not null items tinyint unsigned not null ordered_at datetime not null shipped_at datetime(6) note text details text order_ref uuid not null total_with_tax decimal(12,2) customers8 wierszy2
8 kolumn id int not null name varchar(100) not null email varchar(200) not null country char(2) not null is_active tinyint(1) not null signed_up date created_at datetime not null row_version blob
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
- "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.
- "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.
- "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 Server | W MariaDB | Wpis w raporcie |
|---|---|---|
| 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 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, 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ę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 |
| datetimeoffset | datetime(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 |
| time | time(p)Te same godziny dnia. | |
| dates before the year 1000 | NULLMariaDB 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. | |
| uniqueidentifier | uuidTe same identyfikatory, zapisane małymi literami. | |
| binary, varbinary, image | binary(n), varbinary(n) i typy blobBajty pozostają bajtami. | |
| geometry, geography | blob z własnymi bajtami SQL ServerSSMS zapisuje wartości przestrzenne w serializacji SQL Server, zachowywanej bajt po bajcie. | spatial_as_native |
| rowversion, timestamp | blob, pustySQL Server sam ustawia wersję wiersza, a SSMS nie zapisuje dla niej wartości. | rowversion_empty |
| xml, sql_variant, hierarchyid, vector | longtextMariaDB 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 |
| IDENTITY | AUTO_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 key | zwykła liczba całkowitaMariaDB liczy jedną kolumnę na tabelę, na początku klucza; każda inna zachowuje wartości bez licznika. | counter_dropped |
| CREATE SEQUENCE | CREATE 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 columns | kolumny 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 lacks | zwykł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 FOR | brak wartości domyślnejWartość domyślna, której nie da się zapisać, jest pomijana i zgłaszana w raporcie. | default_not_translated |
| CHECK constraints | przetłumaczoneTe same ograniczenia CHECK, sprawdzane przy ładowaniu każdego wiersza. | |
| CHECK constraints with functions MariaDB lacks | nie jest tworzoneOgraniczenie CHECK, którego nie da się zapisać, jest pomijane i zgłaszane w raporcie. | check_skipped |
| CHECK constraints added WITH NOCHECK or disabled | nie jest tworzoneSQL Server nie stosuje tych ograniczeń CHECK, więc wiersze mogą je łamać. | check_not_enforced |
| filtered and columnstore indexes | nie jest tworzoneIntoSQL zapisuje indeksy b-tree na całych kolumnach; pozostałe utwórz ponownie po załadowaniu. | index_skipped |
| foreign keys | klucze 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 create | nie jest tworzoneKlucz nie może wskazywać tabeli, której nie ma. | foreign_key_skipped |
| tables on a partition scheme | jedna 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. | |
| schemas | jedna 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 NULL | NOT 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 functions | wymienione 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 values | NULLKonwerter, który nie uruchamia bazy danych, nie może ich obliczyć. | expression_value |
| types IntoSQL doesn't know | longtextTekst mieści każdą wartość; zmień typ po załadowaniu. | unknown_type |
| NUL characters in text | zachowaneWartość 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ę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.sqlKlucze 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.