Naar de inhoud
IntoSQL-startpagina

MySQL omzetten naar SQL Server

Zet een dump van mysqldump, mariadb-dump, mysqlpump, 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.

Je bestand
sqlshop_2024.sqlVoorbeeldbestand, 5,1 kB
Je database

18 rijen geconverteerd, 10 correcties, geen afgewezen

Tonen

Tabellen in shop_2024.sqlMySQL 8.0.46-dump · geschreven door mysqldump · utf8mb4

  • customers8 rijen4
    7 kolommen
    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 rijen6
    9 kolommen
    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

Correcties

  1. "id" van customers is unsigned, dus het is bigint geworden met een check dat het niet negatief is.
  2. "name" van customers bevat tekens die SQL Server dubbel telt, zoals emoji, dus het is nvarchar(200).
  3. "signed_up" van customers staat nu NULL toe: sommige waarden konden niet worden opgeslagen en zijn NULL.
  4. De standaardwaarde van "signed_up" in customers, 0000‑00‑00, is geen datum die SQL Server accepteert, dus de kolom heeft geen standaardwaarde.
  5. "customer_id" van orders is unsigned, dus het is bigint geworden met een check dat het niet negatief is.
  6. "id" van orders is unsigned, dus het is bigint geworden met een check dat het niet negatief is.
  7. "items" van orders is unsigned, dus het is int geworden met een check dat het niet negatief is.
  8. "note" van orders bevat tekens die SQL Server dubbel telt, zoals emoji, dus het is nvarchar(510).
  9. 1 rij van "status" in orders bevat de lege waarde die MySQL opslaat voor ongeldige invoer; de check op de waarden staat die toe.
  10. "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 MySQL 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 MySQLIn SQL ServerRapportregel
TINYINT(1), BOOLbit 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 integersTINYINT 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 widthsweggelatenOpvulling 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 NULLNOT 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
TIMEtime 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
YEARsmallint 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
DATETIMEdatetime2Een DATETIME is een kloktijd zonder tijdzone, net als datetime2.
TIMESTAMPdatetimeoffset 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
ENUMnvarchar 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 listgeen CHECKWaarden die niet in de lijst staan, zouden de check laten mislukken, dus de check wordt niet aangemaakt.enum_check_skipped
SETnvarchar zoals MySQL het schrijft ('a,b')SQL Server heeft geen arrays; de tekst is die MySQL teruggeeft.
JSONnvarchar(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 textbehoudennvarchar kan een NUL-teken bevatten, dus de waarde wordt ongewijzigd gekopieerd.
text that isn't valid in its character setde 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_INCREMENTIDENTITY, 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_TIMESTAMPeen 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 keyniet overgenomenDe trigger vindt de bijgewerkte rijen via hun primaire sleutel; zonder sleutel lukt dat niet.on_update_without_key
generated columnsberekende kolommen, PERSISTED als de bron ze opslaatSQL Server berekent ze op dezelfde twee manieren.
generated columns with functions SQL Server lackseen 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 columnsgewone kolommenSQL Server heeft geen onzichtbare kolommen.invisible_column
CHECK constraintsvertaald, inline in CREATE TABLEInline checks worden getest terwijl elke rij laadt.
CHECK constraints with functions SQL Server lacksniet aangemaaktEen check die niet voor SQL Server kan worden geschreven, wordt weggelaten en gemeld.check_skipped
CHECK ... NOT ENFORCEDniet aangemaaktMySQL bewaart deze checks zonder ze toe te passen, dus de rijen kunnen ze schenden.check_not_enforced
defaults with functions SQL Server lacksgeen 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 indexesniet aangemaaktZoeken in volledige tekst in SQL Server heeft een catalogus en eigen query's nodig.fulltext_not_created
SPATIAL indexesniet 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 lengthniet aangemaaktSQL Server indexeert geen expressies en geen kolommen van nvarchar(max) en varbinary(max).index_skipped
foreign keysna 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 pathNO 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 keyniet 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 nameszoals geschreven; hernoemd als ze alleen in hoofdletters verschillenNamen in SQL Server negeren hoofdletters onder de gebruikelijke collatie.identifier_renamed
names over 116 charactersingekortNamen 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, BLOBbinary, 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 engineseen gewone tabelSQL Server heeft één tabelengine.engine_dropped
views, triggers, procedures, functions and eventsvermeld 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 TABLEtypen 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 TABLEgeometryHet geometrieformaat van MySQL wordt herkend aan de waarden.
_ci collationsde 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 tablesgeconverteerd, 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-8gelezen als Latin-1 (Windows-1252)latin1 in MySQL is Windows-1252, de gebruikelijke codering van zulke dumps.charset_guessed
sjis, cp932, gbk, big5 dumpsgelezen als UTF-8, met een waarschuwingDeze coderingen worden nog niet gedecodeerd.unsupported_charset
UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rowsgeë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 rowsNULLEen converter die geen database draait, kan ze niet evalueren.expression_value
DEFAULT in VALUESde standaardwaarde van de kolomEen letterlijke standaardwaarde wordt in de rij gekopieerd.default_keyword_filled
DEFAULT in VALUES without a literal defaultNULLEr is geen waarde om te kopiëren.default_keyword_null
REPLACE and INSERT IGNOREgewone rijenEen dump heeft één rij per sleutel, dus de rijen zijn dezelfde.replace_as_insert
types IntoSQL doesn't knownvarchar(max)Tekst kan elke waarde bevatten; wijzig het type na het laden.unknown_type
values that don't fit their columnNULLEen 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 geometriesNULLBytes 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 mysql.sql_server.sql

Refererende 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 MySQL 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 utf8-dump kwijtraakt voordat de converter hem ziet.
  • --hex-blob schrijft binaire kolommen 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 worden geschreven in de eigen taal van elke database. Ze staan op naam in het rapport en worden nooit stilletjes weggelaten, zodat je ze kunt herschrijven voor SQL Server.

Vragen over MySQL 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.

Leest het MariaDB-dumps?

Ja. Dumps van mariadb-dump en van MariaDB 10.3 tot en met 12 worden op dezelfde manier geconverteerd, inclusief de INET6-, INET4- en UUID-kolommen van MariaDB.

Wat gebeurt er met datums als 0000-00-00?

SQL Server kent geen nuldatum, dus ze worden NULL en de kolom accepteert NULL. Het rapport vermeldt hoeveel er in elke kolom waren.

Blijven AUTO_INCREMENT-waarden behouden?

Ja. Elke AUTO_INCREMENT-kolom wordt een IDENTITY-kolom, elke rij behoudt zijn id, en het volgende id gaat verder na het hoogste, of na de AUTO_INCREMENT van de tabel als die hoger is.

Wordt TINYINT(1) boolean?

Het wordt alleen bit als elke waarde in de kolom 0 of 1 is. Bevat hij andere getallen, zoals 2 of -1, dan blijft het een getal en legt het rapport uit waarom, zodat geen waarde per ongeluk 1 wordt.

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. ON UPDATE CURRENT_TIMESTAMP is de uitzondering: dat wordt een SQL Server-trigger.

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.