MariaDB omzetten naar SQL Server
Zet een dump van mariadb-dump, mysqldump, phpMyAdmin of Adminer neer, als .sql of .sql.gz, en download een SQL Server-script met dezelfde tabellen, sleutels, indexen en data. Elke waarde die SQL Server niet ongewijzigd kan bevatten, en elk object dat het niet overneemt, staat in het rapport.
18 rijen geconverteerd, 10 correcties, geen afgewezen
Tabellen in shop_2024_mariadb.sqlMariaDB 11.8.9-MariaDB-ubu2404-dump · geschreven door mariadb-dump · utf8mb4
customers8 rijen4
8 kolommen id bigint not null name nvarchar(200) not null email nvarchar(150) not null country nvarchar(2) not null is_active bit not null signed_up date created_at datetimeoffset(0) not null last_ip nvarchar(39) orders10 rijen6
12 kolommen id bigint not null customer_id bigint not null status nvarchar(9) not null total decimal(10,2) not null items int not null ordered_at datetime2(0) not null shipped_at datetime2(0) note nvarchar(510) order_ref uniqueidentifier not null invoice int not null details nvarchar(max) updated_at datetimeoffset(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 SEQUENCE [dbo].[invoice_numbers] AS bigint START WITH 2000 INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775806;
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,
[last_ip] nvarchar(39) 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,
[order_ref] uniqueidentifier NOT NULL,
[invoice] int DEFAULT (NEXT VALUE FOR [dbo].[invoice_numbers]) NOT NULL,
[details] nvarchar(max) 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], [last_ip]) VALUES
(1,N'Ana Martínez',N'ana@example.com',N'MX',1,'2023-01-15','2023-01-15 10:24:00+00:00',N'::ffff:203.0.113.7'),
(2,N'Zoë Müller',N'zoe@example.de',N'DE',1,'2023-02-03','2023-02-03 08:11:42+00:00',N'2001:db8::1'),
(3,N'José Peña',N'jose@example.es',N'ES',0,'2023-03-21','2023-03-21 19:05:17+00:00',NULL),
(4,N'李雷',N'lilei@example.cn',N'CN',1,'2023-05-09','2023-05-09 02:40:00+00:00',N'::ffff:198.51.100.23'),
(5,N'Noah O''Brien',N'noah@example.ie',N'IE',1,NULL,'2023-06-30 14:00:00+00:00',NULL),
(6,N'Amélie Laurent',N'amelie@example.fr',N'FR',1,'2024-01-02','2024-01-02 09:30:00+00:00',N'2001:db8:85a3::8a2e:370:7334'),
(7,N'Ravi Patel',N'ravi@example.in',N'IN',0,'2024-02-29','2024-02-29 23:59:59+00:00',N'::ffff:192.0.2.200'),
(8,N'Sofia Rossi 🌻',N'sofia@example.it',N'IT',1,'2024-04-12','2024-04-12 12:12:12+00:00',NULL);
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], [order_ref], [invoice], [details], [updated_at]) VALUES
(1,1,N'shipped',129.90,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,N'0b7a4c2e-3f1d-4e8a-9c55-1a2b3c4d5e6f',1000,N'{"gift": false}','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 🎁',N'1c8b5d3f-4a2e-4f9b-8d66-2b3c4d5e6f70',1001,N'{"gift": true, "wrap": "red"}','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',N'2d9c6e4a-5b3f-4a0c-9e77-3c4d5e6f7081',1002,NULL,'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'请小心轻放',N'3e0d7f5b-6c4a-4b1d-8f88-4d5e6f708192',1003,N'{"fragile": true}','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',N'4f1e806c-7d5b-4c2e-9a99-5e6f708192a3',1004,NULL,'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"',N'50f2917d-8e6c-4d3f-8baa-6f708192a3b4',1005,N'{"fragile": true}','2024-03-11 09:00:00+00:00'),
(7,8,N'paid',76.20,2,'2024-03-11 18:45:00',NULL,NULL,N'6103a28e-9f7d-4e40-9cbb-708192a3b4c5',1006,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',N'7214b39f-a08e-4f51-8dcc-8192a3b4c5d6',1007,NULL,'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',N'8325c4a0-b19f-4062-9edd-92a3b4c5d6e7',1008,N'{"parcels": [1, 2]}','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',N'9436d5b1-c2a0-4173-8fee-a3b4c5d6e7f8',1009,NULL,'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
Correcties
- "id" van customers is unsigned, dus het is bigint geworden met een check dat het niet negatief is.
- "name" van customers bevat tekens die SQL Server dubbel telt, zoals emoji, dus het is nvarchar(200).
- "signed_up" van customers staat nu NULL toe: sommige waarden konden niet worden opgeslagen en zijn NULL.
- De standaardwaarde van "signed_up" in customers, 0000‑00‑00, is geen datum die SQL Server accepteert, dus de kolom heeft geen standaardwaarde.
- "customer_id" van orders is unsigned, dus het is bigint geworden met een check dat het niet negatief is.
- "id" van orders is unsigned, dus het is bigint geworden met een check dat het niet negatief is.
- "items" van orders is unsigned, dus het is int geworden met een check dat het niet negatief is.
- "note" van orders bevat tekens die SQL Server dubbel telt, zoals emoji, dus het is nvarchar(510).
- 1 rij van "status" in orders bevat de lege waarde die MySQL opslaat voor ongeldige invoer; de check op de waarden staat die toe.
- "updated_at" van orders verandert bij elke update in de huidige tijd; in SQL Server doet een trigger dat.
Na te kijken
- 1 waarde in "signed_up" van customers is een nul- of onmogelijke datum zoals 0000‑00‑00, die SQL Server niet kan opslaan, dus die is NULL. Als die datums iets betekenen, vervang ze dan in de bron door echte datums voordat je de dump maakt.
- 1 waarde in "shipped_at" van orders is een nul- of onmogelijke datum zoals 0000‑00‑00 00:00:00, die SQL Server niet kan opslaan, dus die is NULL. Als die datums iets betekenen, vervang ze dan in de bron door echte datums voordat je de dump maakt.
Je bestand wordt op deze computer omgezet en nooit geüpload.
Andere voorbeelden:
Wat er verandert van MariaDB naar SQL Server
Elke rij is een regel die de converter toepast, met de rapportregel die hij schrijft als de regel iets in je data verandert.
TINYINT(1), BOOL
bit als elke waarde 0 of 1 is, anders smallint
BOOL in MySQL is een TINYINT(1) die elk getal van -128 tot 127 kan bevatten. Een kolom met alleen 0 en 1 wordt bit; een kolom met 2 of -1 blijft een getal, zodat geen waarde van betekenis verandert.
Rapportregel: bool_kept_numeric
UNSIGNED integers
TINYINT UNSIGNED als tinyint; de andere als het eerstvolgende bredere gehele getal met een CHECK dat het niet negatief is, BIGINT UNSIGNED als bigint als elke waarde past, anders decimal(38,0)
SQL Server heeft geen unsigned gehele getallen behalve tinyint, dat van 0 tot 255 gaat. Een breder type bevat het hele unsigned bereik, en de check houdt negatieve waarden buiten, zoals MySQL deed.
Rapportregel: unsigned_widened
ZEROFILL and display widths
weggelaten
Opvulling met nullen is een manier om een getal te tonen, geen deel ervan. De getallen blijven; formatteer ze bij het lezen als de opvulling ertoe doet.
Rapportregel: zerofill_dropped
FLOAT(M,D)
real of float, zonder de schaal
Drijvendekommagetallen in SQL Server hebben geen vaste schaal. De opgeslagen waarden worden ongewijzigd gekopieerd.
Rapportregel: float_scale_dropped
DECIMAL(p,s)
decimal(p,s) tot 38 cijfers; daarboven nvarchar
decimal in SQL Server bevat 38 cijfers. Bredere decimalen blijven tekst, zodat elk cijfer exact blijft.
Rapportregel: decimal_as_text
BIT(1), BIT(n)
bit; bigint tot 63 bits; decimal(20,0) voor BIT(64)
Eén bit is een ja of nee; bredere bitvelden worden opgeslagen als het getal dat hun bits vormen.
zero, partial or impossible dates (0000-00-00, 2024-02-30)
NULL
SQL Server slaat alleen echte kalenderdatums op. MySQL bewaart nul- en onmogelijke datums als de SQL-modus dat toestaat; ze worden NULL en het rapport telt ze.
Rapportregel: invalid_date_null
NOT NULL columns with values that become NULL
NOT NULL weggelaten
Een kolom waarvan waarden NULL moesten worden, kan NOT NULL niet houden, anders zou het laden stoppen.
Rapportregel: not_null_relaxed
DEFAULT '0000-00-00'
geen standaardwaarde
Een standaardwaarde die SQL Server niet kan opslaan, wordt weggelaten in plaats van vervangen door een verzonnen datum.
Rapportregel: zero_date_default
TIME
time als elke waarde binnen een dag valt, anders nvarchar
TIME in MySQL is een duur van -838:59:59 tot 838:59:59; time in SQL Server is een tijdstip. Een kolom met langere of negatieve waarden bewaart ze als tekst.
Rapportregel: time_as_interval
YEAR
smallint met een CHECK op het bereik
SQL Server heeft geen jaartype; de check houdt dezelfde waarden die MySQL toestaat.
CHAR(n), VARCHAR(n)
nvarchar(n)
nvarchar bevat elk teken op elke ondersteunde versie, en MySQL geeft CHAR-waarden terug zonder spaties aan het einde, zoals nvarchar ze bewaart.
text with characters past U+FFFF (emoji) in VARCHAR(n)
nvarchar(2n), of nvarchar(max) boven 4000
nvarchar telt UTF-16-eenheden en een emoji neemt er twee, dus de kolom krijgt ruimte voor elke waarde.
Rapportregel: text_length_widened
DATETIME
datetime2
Een DATETIME is een kloktijd zonder tijdzone, net als datetime2.
TIMESTAMP
datetimeoffset in de tijdzone die de dump vermeldt, UTC als die er geen vermeldt
Een TIMESTAMP is een moment. Dumps vermelden de zone waarin ze het schreven (mysqldump schrijft UTC); zonder die vermelding worden de waarden gelezen als UTC en meldt het rapport dat.
Rapportregel: timestamp_zone_assumed
ENUM
nvarchar met een CHECK op de waarden
Tekst met een check houdt dezelfde waarden.
ENUM holding '' (MySQL's error value)
de lege waarde, toegestaan door de check
MySQL slaat een lege string op als er in een tolerante SQL-modus een ongeldige waarde in een ENUM komt. Die rijen blijven behouden en de check staat ze toe.
Rapportregel: enum_invalid_value
ENUM holding values outside its list
geen CHECK
Waarden die niet in de lijst staan, zouden de check laten mislukken, dus de check wordt niet aangemaakt.
Rapportregel: enum_check_skipped
SET
nvarchar zoals MySQL het schrijft ('a,b')
SQL Server heeft geen arrays; de tekst is die MySQL teruggeeft.
JSON
nvarchar(max)
De JSON-functies van SQL Server lezen JSON uit tekst. Een ISJSON-check zou vóór SQL Server 2022 scalaire waarden zoals 1 of "x" weigeren, die MySQL bewaart.
NUL bytes in text
behouden
nvarchar kan een NUL-teken bevatten, dus de waarde wordt ongewijzigd gekopieerd.
text that isn't valid in its character set
de foute bytes als het vervangingsteken
Tekst moet als tekens worden gelezen om als nvarchar te worden geschreven.
Rapportregel: invalid_utf8_replaced
text decoded twice (ñ)
ongewijzigd gekopieerd
De dump bevat precies deze tekens, dus ze worden gekopieerd; het rapport wijst ze aan.
Rapportregel: mojibake_suspected
AUTO_INCREMENT
IDENTITY, met de teller voorbij de gekopieerde id's
De gekopieerde id's laden met IDENTITY_INSERT, en de teller gaat verder na het hoogste daarvan of na de AUTO_INCREMENT van de dump, welke hoger is.
MyISAM AUTO_INCREMENT on the second column of a key
één teller voor de tabel
MyISAM telt per groep van de eerste kolom van de sleutel; SQL Server heeft één teller per tabel.
Rapportregel: myisam_group_autoincrement
ON UPDATE CURRENT_TIMESTAMP
een AFTER UPDATE-trigger
De trigger zet de kolom op de huidige tijd als een update hem niet instelt. Hij koppelt op de primaire sleutel, dus de tabel heeft er een nodig.
Rapportregel: on_update_trigger
ON UPDATE CURRENT_TIMESTAMP on a table without a primary key
niet overgenomen
De trigger vindt de bijgewerkte rijen via hun primaire sleutel; zonder sleutel lukt dat niet.
Rapportregel: on_update_without_key
generated columns
berekende kolommen, PERSISTED als de bron ze opslaat
SQL Server berekent ze op dezelfde twee manieren.
generated columns with functions SQL Server lacks
een gewone kolom
Een formule die niet voor SQL Server kan worden geschreven, levert een gewone kolom en een regel in het rapport op.
Rapportregel: generated_not_translated
INVISIBLE columns
gewone kolommen
SQL Server heeft geen onzichtbare kolommen.
Rapportregel: invisible_column
CHECK constraints
vertaald, inline in CREATE TABLE
Inline checks worden getest terwijl elke rij laadt.
CHECK constraints with functions SQL Server lacks
niet aangemaakt
Een check die niet voor SQL Server kan worden geschreven, wordt weggelaten en gemeld.
Rapportregel: check_skipped
CHECK ... NOT ENFORCED
niet aangemaakt
MySQL bewaart deze checks zonder ze toe te passen, dus de rijen kunnen ze schenden.
Rapportregel: check_not_enforced
defaults with functions SQL Server lacks
geen standaardwaarde
Een standaardwaarde die niet voor SQL Server kan worden geschreven, wordt weggelaten en gemeld.
Rapportregel: default_not_translated
keys and indexes on a prefix, c(20)
een index op de hele kolom
SQL Server indexeert hele kolommen; een sleutel die uniek is op een prefix, is ook uniek op de hele kolom, dus elke rij laadt.
Rapportregel: prefix_whole_column
FULLTEXT indexes
niet aangemaakt
Zoeken in volledige tekst in SQL Server heeft een catalogus en eigen query's nodig.
Rapportregel: fulltext_not_created
SPATIAL indexes
niet aangemaakt
Een ruimtelijke index op een geometriekolom heeft een begrenzingsvak nodig dat de dump niet vermeldt.
Rapportregel: spatial_index_not_created
functional indexes, and indexes on columns of unlimited length
niet aangemaakt
SQL Server indexeert geen expressies en geen kolommen van nvarchar(max) en varbinary(max).
Rapportregel: index_skipped
foreign keys
na de data, WITH NOCHECK, daarna gecontroleerd met een waarschuwing bij wezen
Dumps laden met FOREIGN_KEY_CHECKS=0 en MyISAM controleert nooit, dus rijen zonder ouder komen vaak voor. De sleutel wordt eerst aangemaakt en als laatste gecontroleerd; wezen laten hem ongecontroleerd met een waarschuwing, in plaats van het laden te stoppen.
ON DELETE or ON UPDATE that cascades in a cycle or along a second path
NO ACTION
SQL Server weigert cascades die een tabel twee keer kunnen bereiken; MySQL staat ze toe.
Rapportregel: foreign_key_action_dropped
foreign keys to columns without a unique key
niet aangemaakt
SQL Server heeft een primaire sleutel of een unieke index zonder NULL's nodig op de kolommen waarnaar wordt verwezen; InnoDB niet.
Rapportregel: foreign_key_skipped
table and column names
zoals geschreven; hernoemd als ze alleen in hoofdletters verschillen
Namen in SQL Server negeren hoofdletters onder de gebruikelijke collatie.
Rapportregel: identifier_renamed
names over 116 characters
ingekort
Namen in SQL Server bevatten 128 tekens, waarvan sommige voor de nummers die namen uit elkaar houden.
Rapportregel: name_shortened
GEOMETRY, POINT, POLYGON...
geometry, met de SRID van elke waarde
Het eigen geometry-type van SQL Server behoudt elke vorm en zijn ruimtelijk referentiesysteem.
INET4, INET6, UUID (MariaDB)
nvarchar(39), uniqueidentifier
uniqueidentifier is de UUID van SQL Server; adressen blijven tekst.
BINARY, VARBINARY, BLOB
binary, varbinary, varbinary(max)
Bytes blijven bytes.
PARTITION BY
één tabel
De rijen zijn dezelfde; partitioneer de tabel opnieuw in SQL Server als dat nodig is.
Rapportregel: partitions_dropped
WITH SYSTEM VERSIONING (MariaDB)
een tabel met de huidige rijen
Een dump bevat alleen de huidige rijen.
Rapportregel: system_versioning_dropped
MyISAM, MEMORY and other engines
een gewone tabel
SQL Server heeft één tabelengine.
Rapportregel: engine_dropped
views, triggers, procedures, functions and events
vermeld in het rapport
Hun code is geschreven in de taal van MySQL, dus ze worden vermeld zodat je ze opnieuw kunt maken.
Rapportregel: not_converted_objects
dumps without CREATE TABLE
typen afgeleid uit de waarden
Een dump gemaakt met --no-create-info bevat alleen rijen, dus de typen komen uit de waarden.
Rapportregel: no_schema
geometries in a dump without CREATE TABLE
geometry
Het geometrieformaat van MySQL wordt herkend aan de waarden.
_ci collations
de collatie van de database, meestal hoofdletterongevoelig
SQL Server vergelijkt tekst onder zijn gebruikelijke collatie zonder op hoofdletters te letten, zoals _ci in MySQL.
SET NAMES utf8 from utf8mb4 tables
geconverteerd, met een waarschuwing
mysqldump van MySQL 5.x schrijft standaard 3-byte utf8 en vervangt elke emoji door een vraagteken voordat een converter het bestand ziet.
Rapportregel: dump_lost_four_byte_chars
dumps without SET NAMES whose text isn't UTF-8
gelezen als Latin-1 (Windows-1252)
latin1 in MySQL is Windows-1252, de gebruikelijke codering van zulke dumps.
Rapportregel: charset_guessed
sjis, cp932, gbk, big5 dumps
gelezen als UTF-8, met een waarschuwing
Deze coderingen worden nog niet gedecodeerd.
Rapportregel: unsupported_charset
UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows
geëvalueerd
Sommige dumptools schrijven waarden als deze aanroepen; ze worden gelezen als de waarden die ze opleveren, met geografische WKT omgezet naar lengtegraad eerst.
other expressions in rows
NULL
Een converter die geen database draait, kan ze niet evalueren.
Rapportregel: expression_value
DEFAULT in VALUES
de standaardwaarde van de kolom
Een letterlijke standaardwaarde wordt in de rij gekopieerd.
Rapportregel: default_keyword_filled
DEFAULT in VALUES without a literal default
NULL
Er is geen waarde om te kopiëren.
Rapportregel: default_keyword_null
REPLACE and INSERT IGNORE
gewone rijen
Een dump heeft één rij per sleutel, dus de rijen zijn dezelfde.
Rapportregel: replace_as_insert
types IntoSQL doesn't know
nvarchar(max)
Tekst kan elke waarde bevatten; wijzig het type na het laden.
Rapportregel: unknown_type
values that don't fit their column
NULL
Een beschadigde of met de hand geschreven dump kan waarden bevatten die de kolom niet aankan; ze worden NULL zodat de rest laadt.
Rapportregel: invalid_value_null
unreadable geometries
NULL
Bytes die geen geometrie zijn, kunnen niet als geometrie worden opgeslagen.
Rapportregel: bad_geometry
CREATE SEQUENCE (MariaDB)
CREATE SEQUENCE ... AS bigint, met de volgende waarde
SQL Server heeft sequences met dezelfde opties; elke sequence gaat verder waar de dump hem achterliet.
VECTOR(n) (MariaDB 11.7+)
nvarchar(max) met de floats als JSON-array
Alleen SQL Server 2025 heeft een vectortype; een JSON-array behoudt elke float op elke versie.
Rapportregel: type_replaced
| In MariaDB | In SQL Server | Rapportregel |
|---|---|---|
| TINYINT(1), BOOL | bit als elke waarde 0 of 1 is, anders smallintBOOL in MySQL is een TINYINT(1) die elk getal van -128 tot 127 kan bevatten. Een kolom met alleen 0 en 1 wordt bit; een kolom met 2 of -1 blijft een getal, zodat geen waarde van betekenis verandert. | bool_kept_numeric |
| UNSIGNED integers | TINYINT UNSIGNED als tinyint; de andere als het eerstvolgende bredere gehele getal met een CHECK dat het niet negatief is, BIGINT UNSIGNED als bigint als elke waarde past, anders decimal(38,0)SQL Server heeft geen unsigned gehele getallen behalve tinyint, dat van 0 tot 255 gaat. Een breder type bevat het hele unsigned bereik, en de check houdt negatieve waarden buiten, zoals MySQL deed. | unsigned_widened |
| ZEROFILL and display widths | weggelatenOpvulling met nullen is een manier om een getal te tonen, geen deel ervan. De getallen blijven; formatteer ze bij het lezen als de opvulling ertoe doet. | zerofill_dropped |
| FLOAT(M,D) | real of float, zonder de schaalDrijvendekommagetallen in SQL Server hebben geen vaste schaal. De opgeslagen waarden worden ongewijzigd gekopieerd. | float_scale_dropped |
| DECIMAL(p,s) | decimal(p,s) tot 38 cijfers; daarboven nvarchardecimal in SQL Server bevat 38 cijfers. Bredere decimalen blijven tekst, zodat elk cijfer exact blijft. | decimal_as_text |
| BIT(1), BIT(n) | bit; bigint tot 63 bits; decimal(20,0) voor BIT(64)Eén bit is een ja of nee; bredere bitvelden worden opgeslagen als het getal dat hun bits vormen. | |
| zero, partial or impossible dates (0000-00-00, 2024-02-30) | NULLSQL Server slaat alleen echte kalenderdatums op. MySQL bewaart nul- en onmogelijke datums als de SQL-modus dat toestaat; ze worden NULL en het rapport telt ze. | invalid_date_null |
| NOT NULL columns with values that become NULL | NOT NULL weggelatenEen kolom waarvan waarden NULL moesten worden, kan NOT NULL niet houden, anders zou het laden stoppen. | not_null_relaxed |
| DEFAULT '0000-00-00' | geen standaardwaardeEen standaardwaarde die SQL Server niet kan opslaan, wordt weggelaten in plaats van vervangen door een verzonnen datum. | zero_date_default |
| TIME | time als elke waarde binnen een dag valt, anders nvarcharTIME in MySQL is een duur van -838:59:59 tot 838:59:59; time in SQL Server is een tijdstip. Een kolom met langere of negatieve waarden bewaart ze als tekst. | time_as_interval |
| YEAR | smallint met een CHECK op het bereikSQL Server heeft geen jaartype; de check houdt dezelfde waarden die MySQL toestaat. | |
| CHAR(n), VARCHAR(n) | nvarchar(n)nvarchar bevat elk teken op elke ondersteunde versie, en MySQL geeft CHAR-waarden terug zonder spaties aan het einde, zoals nvarchar ze bewaart. | |
| text with characters past U+FFFF (emoji) in VARCHAR(n) | nvarchar(2n), of nvarchar(max) boven 4000nvarchar telt UTF-16-eenheden en een emoji neemt er twee, dus de kolom krijgt ruimte voor elke waarde. | text_length_widened |
| DATETIME | datetime2Een DATETIME is een kloktijd zonder tijdzone, net als datetime2. | |
| TIMESTAMP | datetimeoffset in de tijdzone die de dump vermeldt, UTC als die er geen vermeldtEen TIMESTAMP is een moment. Dumps vermelden de zone waarin ze het schreven (mysqldump schrijft UTC); zonder die vermelding worden de waarden gelezen als UTC en meldt het rapport dat. | timestamp_zone_assumed |
| ENUM | nvarchar met een CHECK op de waardenTekst met een check houdt dezelfde waarden. | |
| ENUM holding '' (MySQL's error value) | de lege waarde, toegestaan door de checkMySQL slaat een lege string op als er in een tolerante SQL-modus een ongeldige waarde in een ENUM komt. Die rijen blijven behouden en de check staat ze toe. | enum_invalid_value |
| ENUM holding values outside its list | geen CHECKWaarden die niet in de lijst staan, zouden de check laten mislukken, dus de check wordt niet aangemaakt. | enum_check_skipped |
| SET | nvarchar zoals MySQL het schrijft ('a,b')SQL Server heeft geen arrays; de tekst is die MySQL teruggeeft. | |
| JSON | nvarchar(max)De JSON-functies van SQL Server lezen JSON uit tekst. Een ISJSON-check zou vóór SQL Server 2022 scalaire waarden zoals 1 of "x" weigeren, die MySQL bewaart. | |
| NUL bytes in text | behoudennvarchar kan een NUL-teken bevatten, dus de waarde wordt ongewijzigd gekopieerd. | |
| text that isn't valid in its character set | de foute bytes als het vervangingstekenTekst moet als tekens worden gelezen om als nvarchar te worden geschreven. | invalid_utf8_replaced |
| text decoded twice (ñ) | ongewijzigd gekopieerdDe dump bevat precies deze tekens, dus ze worden gekopieerd; het rapport wijst ze aan. | mojibake_suspected |
| AUTO_INCREMENT | IDENTITY, met de teller voorbij de gekopieerde id'sDe gekopieerde id's laden met IDENTITY_INSERT, en de teller gaat verder na het hoogste daarvan of na de AUTO_INCREMENT van de dump, welke hoger is. | |
| MyISAM AUTO_INCREMENT on the second column of a key | één teller voor de tabelMyISAM telt per groep van de eerste kolom van de sleutel; SQL Server heeft één teller per tabel. | myisam_group_autoincrement |
| ON UPDATE CURRENT_TIMESTAMP | een AFTER UPDATE-triggerDe trigger zet de kolom op de huidige tijd als een update hem niet instelt. Hij koppelt op de primaire sleutel, dus de tabel heeft er een nodig. | on_update_trigger |
| ON UPDATE CURRENT_TIMESTAMP on a table without a primary key | niet overgenomenDe trigger vindt de bijgewerkte rijen via hun primaire sleutel; zonder sleutel lukt dat niet. | on_update_without_key |
| generated columns | berekende kolommen, PERSISTED als de bron ze opslaatSQL Server berekent ze op dezelfde twee manieren. | |
| generated columns with functions SQL Server lacks | een gewone kolomEen formule die niet voor SQL Server kan worden geschreven, levert een gewone kolom en een regel in het rapport op. | generated_not_translated |
| INVISIBLE columns | gewone kolommenSQL Server heeft geen onzichtbare kolommen. | invisible_column |
| CHECK constraints | vertaald, inline in CREATE TABLEInline checks worden getest terwijl elke rij laadt. | |
| CHECK constraints with functions SQL Server lacks | niet aangemaaktEen check die niet voor SQL Server kan worden geschreven, wordt weggelaten en gemeld. | check_skipped |
| CHECK ... NOT ENFORCED | niet aangemaaktMySQL bewaart deze checks zonder ze toe te passen, dus de rijen kunnen ze schenden. | check_not_enforced |
| defaults with functions SQL Server lacks | geen standaardwaardeEen standaardwaarde die niet voor SQL Server kan worden geschreven, wordt weggelaten en gemeld. | default_not_translated |
| keys and indexes on a prefix, c(20) | een index op de hele kolomSQL Server indexeert hele kolommen; een sleutel die uniek is op een prefix, is ook uniek op de hele kolom, dus elke rij laadt. | prefix_whole_column |
| FULLTEXT indexes | niet aangemaaktZoeken in volledige tekst in SQL Server heeft een catalogus en eigen query's nodig. | fulltext_not_created |
| SPATIAL indexes | niet aangemaaktEen ruimtelijke index op een geometriekolom heeft een begrenzingsvak nodig dat de dump niet vermeldt. | spatial_index_not_created |
| functional indexes, and indexes on columns of unlimited length | niet aangemaaktSQL Server indexeert geen expressies en geen kolommen van nvarchar(max) en varbinary(max). | index_skipped |
| foreign keys | na de data, WITH NOCHECK, daarna gecontroleerd met een waarschuwing bij wezenDumps laden met FOREIGN_KEY_CHECKS=0 en MyISAM controleert nooit, dus rijen zonder ouder komen vaak voor. De sleutel wordt eerst aangemaakt en als laatste gecontroleerd; wezen laten hem ongecontroleerd met een waarschuwing, in plaats van het laden te stoppen. | |
| ON DELETE or ON UPDATE that cascades in a cycle or along a second path | NO ACTIONSQL Server weigert cascades die een tabel twee keer kunnen bereiken; MySQL staat ze toe. | foreign_key_action_dropped |
| foreign keys to columns without a unique key | niet aangemaaktSQL Server heeft een primaire sleutel of een unieke index zonder NULL's nodig op de kolommen waarnaar wordt verwezen; InnoDB niet. | foreign_key_skipped |
| table and column names | zoals geschreven; hernoemd als ze alleen in hoofdletters verschillenNamen in SQL Server negeren hoofdletters onder de gebruikelijke collatie. | identifier_renamed |
| names over 116 characters | ingekortNamen in SQL Server bevatten 128 tekens, waarvan sommige voor de nummers die namen uit elkaar houden. | name_shortened |
| GEOMETRY, POINT, POLYGON... | geometry, met de SRID van elke waardeHet eigen geometry-type van SQL Server behoudt elke vorm en zijn ruimtelijk referentiesysteem. | |
| INET4, INET6, UUID (MariaDB) | nvarchar(39), uniqueidentifieruniqueidentifier is de UUID van SQL Server; adressen blijven tekst. | |
| BINARY, VARBINARY, BLOB | binary, varbinary, varbinary(max)Bytes blijven bytes. | |
| PARTITION BY | één tabelDe rijen zijn dezelfde; partitioneer de tabel opnieuw in SQL Server als dat nodig is. | partitions_dropped |
| WITH SYSTEM VERSIONING (MariaDB) | een tabel met de huidige rijenEen dump bevat alleen de huidige rijen. | system_versioning_dropped |
| MyISAM, MEMORY and other engines | een gewone tabelSQL Server heeft één tabelengine. | engine_dropped |
| views, triggers, procedures, functions and events | vermeld in het rapportHun code is geschreven in de taal van MySQL, dus ze worden vermeld zodat je ze opnieuw kunt maken. | not_converted_objects |
| dumps without CREATE TABLE | typen afgeleid uit de waardenEen dump gemaakt met --no-create-info bevat alleen rijen, dus de typen komen uit de waarden. | no_schema |
| geometries in a dump without CREATE TABLE | geometryHet geometrieformaat van MySQL wordt herkend aan de waarden. | |
| _ci collations | de collatie van de database, meestal hoofdletterongevoeligSQL Server vergelijkt tekst onder zijn gebruikelijke collatie zonder op hoofdletters te letten, zoals _ci in MySQL. | |
| SET NAMES utf8 from utf8mb4 tables | geconverteerd, met een waarschuwingmysqldump van MySQL 5.x schrijft standaard 3-byte utf8 en vervangt elke emoji door een vraagteken voordat een converter het bestand ziet. | dump_lost_four_byte_chars |
| dumps without SET NAMES whose text isn't UTF-8 | gelezen als Latin-1 (Windows-1252)latin1 in MySQL is Windows-1252, de gebruikelijke codering van zulke dumps. | charset_guessed |
| sjis, cp932, gbk, big5 dumps | gelezen als UTF-8, met een waarschuwingDeze coderingen worden nog niet gedecodeerd. | unsupported_charset |
| UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows | geëvalueerdSommige dumptools schrijven waarden als deze aanroepen; ze worden gelezen als de waarden die ze opleveren, met geografische WKT omgezet naar lengtegraad eerst. | |
| other expressions in rows | NULLEen converter die geen database draait, kan ze niet evalueren. | expression_value |
| DEFAULT in VALUES | de standaardwaarde van de kolomEen letterlijke standaardwaarde wordt in de rij gekopieerd. | default_keyword_filled |
| DEFAULT in VALUES without a literal default | NULLEr is geen waarde om te kopiëren. | default_keyword_null |
| REPLACE and INSERT IGNORE | gewone rijenEen dump heeft één rij per sleutel, dus de rijen zijn dezelfde. | replace_as_insert |
| types IntoSQL doesn't know | nvarchar(max)Tekst kan elke waarde bevatten; wijzig het type na het laden. | unknown_type |
| values that don't fit their column | NULLEen beschadigde of met de hand geschreven dump kan waarden bevatten die de kolom niet aankan; ze worden NULL zodat de rest laadt. | invalid_value_null |
| unreadable geometries | NULLBytes die geen geometrie zijn, kunnen niet als geometrie worden opgeslagen. | bad_geometry |
| CREATE SEQUENCE (MariaDB) | CREATE SEQUENCE ... AS bigint, met de volgende waardeSQL Server heeft sequences met dezelfde opties; elke sequence gaat verder waar de dump hem achterliet. | |
| VECTOR(n) (MariaDB 11.7+) | nvarchar(max) met de floats als JSON-arrayAlleen SQL Server 2025 heeft een vectortype; een JSON-array behoudt elke float op elke versie. | type_replaced |
Het script in SQL Server laden
Het script maakt de tabellen aan, kopieert de rijen en voegt daarna sleutels, indexen en refererende sleutels toe, zodat het snel laadt en bij de eerste fout stopt.
sqlcmd -b -f 65001 -S localhost -d mydb -i mariadb.sql_server.sqlRefererende sleutels worden toegevoegd met WITH NOCHECK en daarna gecontroleerd. Verwijst een rij naar een rij die niet bestaat, dan vertelt het script welke constraint het is en laat het die ongecontroleerd, in plaats van halverwege te mislukken.
Voer bij een grote dump sqlcmd uit op dezelfde machine als de server. Elke batch van maximaal 1000 rijen wordt apart gecommit, zodat het transactielogboek klein blijft.
Een dump van MariaDB maken voor het beste resultaat
De converter leest wat de dump bevat. Met deze opties blijft er meer van je data in staan:
- --default-character-set=utf8mb4 behoudt emoji en andere 4-bytestekens, die een utf8mb3-dump kwijtraakt voordat de converter hem ziet.
- --hex-blob schrijft binaire kolommen en VECTOR-waarden als hexadecimaal, wat kopiëren tussen systemen overleeft.
- --routines --triggers --events voegen die objecten aan de dump toe, zodat het rapport ze kan vermelden.
Wat niet wordt geconverteerd
Weergaven, triggers, opgeslagen procedures, functies en gebeurtenissen zijn geschreven in de eigen taal van MariaDB. Ze staan op naam in het rapport en worden nooit stilletjes weggelaten, zodat je ze kunt herschrijven voor SQL Server.
Vragen over MariaDB naar SQL Server
Staat je vraag er niet bij? Schrijf ons via de contactpagina en een mens antwoordt. Contactpagina
Wordt mijn dump geüpload?
Nee. De converter draait in je browser en leest de dump in delen van je schijf, dus hij verlaat je computer nooit. De desktopapp en de opdrachtregel converteren ook op je computer.
Hoe groot mag de dump zijn?
De converter houdt nooit de hele dump in het geheugen: hij leest het bestand twee keer, in bereiken, en schrijft het script gaandeweg. Dumps van meerdere gigabytes worden geconverteerd in de browser, in de desktopapp en met de opdrachtregel.
Van welke MariaDB-versies kan de dump komen?
Dumps van mariadb-dump en mysqldump op MariaDB 10.3 tot en met 12, met één INSERT per tabel of één per rij. Elke testdump komt van MariaDB 10.11, 11.4 en 11.8 en wordt cel voor cel met zijn bron vergeleken.
Blijven UUID-, INET6-, JSON- en VECTOR-kolommen behouden?
UUID wordt uniqueidentifier, INET-kolommen nvarchar, JSON nvarchar(max) en VECTOR een JSON-array van zijn floats. Nuldatums worden NULL en het rapport telt ze.
Blijven AUTO_INCREMENT-waarden en sequences behouden?
Ja. Elke AUTO_INCREMENT-kolom wordt een IDENTITY-kolom die verdergaat na het hoogste id. Sequences worden SQL Server-sequences, en standaardwaarden die er een waarde uit halen, blijven dat doen.
En opgeslagen procedures en triggers?
Ze staan op naam in het rapport en worden niet geconverteerd, omdat elke database ze in een eigen taal schrijft.
Op welke SQL Server-versies laadt het script?
SQL Server 2017 tot en met 2025. Hetzelfde script laadt op elk ervan en stopt bij de eerste fout als er iets misgaat.