Zum Inhalt springen
IntoSQL-Startseite

MariaDB in SQL Server umwandeln

Leg einen Dump aus mariadb-dump, mysqldump, phpMyAdmin oder Adminer ab, als .sql oder .sql.gz, und lade ein SQL Server-Skript mit denselben Tabellen, Schlüsseln, Indizes und Daten herunter. Jeder Wert, den SQL Server nicht unverändert aufnehmen kann, und jedes Objekt, das es nicht übernimmt, steht im Bericht.

Deine Datei
sqlshop_2024_mariadb.sqlBeispieldatei, 6,6 kB
Deine Datenbank

18 Zeilen konvertiert, 10 Korrekturen, keine abgelehnt

Anzeigen

Tabellen in shop_2024_mariadb.sqlMariaDB-11.8.9-MariaDB-ubu2404-Dump · erstellt mit mariadb-dump · utf8mb4

  • customers8 Zeilen4
    8 Spalten
    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
    last_ipnvarchar(39)
  • orders10 Zeilen6
    12 Spalten
    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)
    order_refuniqueidentifier not null
    invoiceint not null
    detailsnvarchar(max)
    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 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

Korrekturen

  1. "id" von customers ist vorzeichenlos und wurde deshalb bigint mit einer CHECK-Bedingung gegen negative Werte.
  2. "name" von customers enthält Zeichen, die SQL Server doppelt zählt, etwa Emoji, daher ist sie nvarchar(200).
  3. "signed_up" von customers erlaubt jetzt NULL: Einige Werte ließen sich nicht speichern und sind NULL.
  4. Der Standardwert von "signed_up" in customers, 0000‑00‑00, ist kein Datum, das SQL Server akzeptiert, daher hat die Spalte keinen Standardwert.
  5. "customer_id" von orders ist vorzeichenlos und wurde deshalb bigint mit einer CHECK-Bedingung gegen negative Werte.
  6. "id" von orders ist vorzeichenlos und wurde deshalb bigint mit einer CHECK-Bedingung gegen negative Werte.
  7. "items" von orders ist vorzeichenlos und wurde deshalb int mit einer CHECK-Bedingung gegen negative Werte.
  8. "note" von orders enthält Zeichen, die SQL Server doppelt zählt, etwa Emoji, daher ist sie nvarchar(510).
  9. 1 Zeile von "status" in orders enthält den leeren Wert, den MySQL für ungültige Einträge speichert; die CHECK-Bedingung der Spalte erlaubt ihn.
  10. "updated_at" von orders wird bei jeder Änderung auf die aktuelle Zeit gesetzt; in SQL Server übernimmt das ein Trigger.

Zu prüfen

  • 1 Wert in "signed_up" von customers ist ein Null- oder unmögliches Datum wie 0000‑00‑00, was SQL Server nicht speichern kann, daher ist er NULL. Wenn diese Datumsangaben etwas bedeuten, ersetze sie vor dem Dump in der Quelle durch echte.
  • 1 Wert in "shipped_at" von orders ist ein Null- oder unmögliches Datum wie 0000‑00‑00 00:00:00, was SQL Server nicht speichern kann, daher ist er NULL. Wenn diese Datumsangaben etwas bedeuten, ersetze sie vor dem Dump in der Quelle durch echte.

Deine Datei wird auf diesem Computer umgewandelt und nie hochgeladen.

Weitere Beispiele:

Was sich von MariaDB zu SQL Server ändert

Jede Zeile ist eine Regel, die der Konverter anwendet, mit der Berichtszeile, die er schreibt, wenn die Regel etwas an deinen Daten ändert.

  • TINYINT(1), BOOL

    bit, wenn jeder Wert 0 oder 1 ist, sonst smallint

    MySQLs BOOL ist ein TINYINT(1), das jede Zahl von -128 bis 127 aufnehmen kann. Eine Spalte, die nur 0 und 1 enthält, wird bit; eine mit 2 oder -1 bleibt eine Zahl, damit kein Wert seine Bedeutung ändert.

    Berichtszeile: bool_kept_numeric

  • UNSIGNED integers

    TINYINT UNSIGNED als tinyint; die anderen als nächstgrößerer Ganzzahltyp mit einem CHECK gegen negative Werte, BIGINT UNSIGNED als bigint, wenn jeder Wert passt, sonst decimal(38,0)

    SQL Server hat keine vorzeichenlosen Ganzzahlen außer tinyint, das von 0 bis 255 reicht. Ein größerer Typ fasst den ganzen vorzeichenlosen Bereich, und die CHECK-Bedingung hält negative Werte fern wie in MySQL.

    Berichtszeile: unsigned_widened

  • ZEROFILL and display widths

    entfernt

    Das Auffüllen mit Nullen ist eine Darstellung der Zahl, kein Teil davon. Die Zahlen bleiben erhalten; formatiere sie beim Lesen, wenn die Auffüllung wichtig ist.

    Berichtszeile: zerofill_dropped

  • FLOAT(M,D)

    real oder float, ohne die Nachkommastellen

    Gleitkommazahlen in SQL Server haben keine feste Skalierung. Die gespeicherten Werte werden unverändert kopiert.

    Berichtszeile: float_scale_dropped

  • DECIMAL(p,s)

    decimal(p,s) bis 38 Stellen; darüber nvarchar

    decimal in SQL Server fasst 38 Stellen. Breitere Dezimalzahlen bleiben Text, damit jede Stelle exakt bleibt.

    Berichtszeile: decimal_as_text

  • BIT(1), BIT(n)

    bit; bigint bis 63 Bit; decimal(20,0) für BIT(64)

    Ein einzelnes Bit ist ein Ja oder Nein; breitere Bitfelder werden als die Zahl gespeichert, die ihre Bits ergeben.

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

    NULL

    SQL Server speichert nur echte Kalenderdaten. MySQL behält Null- und unmögliche Datumsangaben, wenn sein SQL-Modus sie erlaubt; sie werden NULL, und der Bericht zählt sie.

    Berichtszeile: invalid_date_null

  • NOT NULL columns with values that become NULL

    NOT NULL entfernt

    Eine Spalte, deren Werte NULL werden mussten, kann NOT NULL nicht behalten, sonst würde das Laden abbrechen.

    Berichtszeile: not_null_relaxed

  • DEFAULT '0000-00-00'

    kein Standardwert

    Ein Standardwert, den SQL Server nicht speichern kann, wird weggelassen, statt durch ein erfundenes Datum ersetzt zu werden.

    Berichtszeile: zero_date_default

  • TIME

    time, wenn jeder Wert innerhalb eines Tages liegt, sonst nvarchar

    MySQLs TIME ist eine Dauer von -838:59:59 bis 838:59:59; time in SQL Server ist eine Uhrzeit. Eine Spalte mit längeren oder negativen Werten behält sie als Text.

    Berichtszeile: time_as_interval

  • YEAR

    smallint mit einem CHECK seines Bereichs

    SQL Server hat keinen Jahrestyp; die CHECK-Bedingung behält dieselben Werte, die MySQL erlaubt.

  • CHAR(n), VARCHAR(n)

    nvarchar(n)

    nvarchar fasst jedes Zeichen auf jeder unterstützten Version, und MySQL gibt CHAR-Werte ohne nachgestellte Leerzeichen zurück, wie nvarchar sie behält.

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

    nvarchar(2n), oder nvarchar(max) über 4000

    nvarchar zählt UTF-16-Einheiten, und ein Emoji belegt zwei, daher bekommt die Spalte Platz für jeden Wert.

    Berichtszeile: text_length_widened

  • DATETIME

    datetime2

    Ein DATETIME ist eine Uhrzeitangabe ohne Zeitzone, wie datetime2.

  • TIMESTAMP

    datetimeoffset in der Zeitzone, die der Dump angibt, UTC, wenn er keine angibt

    Ein TIMESTAMP ist ein Zeitpunkt. Dumps geben die Zone an, in der sie ihn geschrieben haben (mysqldump schreibt UTC); ohne diese Angabe werden die Werte als UTC gelesen, und der Bericht sagt es.

    Berichtszeile: timestamp_zone_assumed

  • ENUM

    nvarchar mit einem CHECK der erlaubten Werte

    Text mit einer CHECK-Bedingung behält dieselben Werte.

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

    der leere Wert, von der CHECK-Bedingung erlaubt

    MySQL speichert einen leeren String, wenn in einem nachsichtigen SQL-Modus ein ungültiger Wert in ein ENUM geschrieben wird. Diese Zeilen bleiben erhalten, und die CHECK-Bedingung erlaubt sie.

    Berichtszeile: enum_invalid_value

  • ENUM holding values outside its list

    kein CHECK

    Werte, die nicht in der Liste stehen, würden die CHECK-Bedingung verletzen, daher wird sie nicht angelegt.

    Berichtszeile: enum_check_skipped

  • SET

    nvarchar, wie MySQL es schreibt ('a,b')

    SQL Server hat keine Arrays; der Text ist der, den MySQL zurückgibt.

  • JSON

    nvarchar(max)

    Die JSON-Funktionen von SQL Server lesen JSON aus Text. Eine CHECK-Bedingung mit ISJSON würde vor SQL Server 2022 skalare Werte wie 1 oder "x" ablehnen, die MySQL behält.

  • NUL bytes in text

    beibehalten

    nvarchar kann ein NUL-Zeichen enthalten, daher wird der Wert unverändert kopiert.

  • text that isn't valid in its character set

    die fehlerhaften Bytes als Ersatzzeichen

    Text muss als Zeichen gelesen werden, um als nvarchar geschrieben zu werden.

    Berichtszeile: invalid_utf8_replaced

  • text decoded twice (ñ)

    unverändert kopiert

    Der Dump enthält genau diese Zeichen, daher werden sie kopiert; der Bericht weist auf sie hin.

    Berichtszeile: mojibake_suspected

  • AUTO_INCREMENT

    IDENTITY, mit dem Zähler hinter den kopierten IDs

    Die kopierten IDs laden mit IDENTITY_INSERT, und der Zähler macht nach der höchsten weiter oder nach dem AUTO_INCREMENT des Dumps, je nachdem, was höher ist.

  • MyISAM AUTO_INCREMENT on the second column of a key

    ein Zähler für die Tabelle

    MyISAM zählt pro Gruppe der ersten Schlüsselspalte; SQL Server hat einen Zähler pro Tabelle.

    Berichtszeile: myisam_group_autoincrement

  • ON UPDATE CURRENT_TIMESTAMP

    ein Trigger mit AFTER UPDATE

    Der Trigger setzt die Spalte auf die aktuelle Zeit, wenn eine Änderung sie nicht setzt. Er verknüpft über den Primärschlüssel, daher braucht die Tabelle einen.

    Berichtszeile: on_update_trigger

  • ON UPDATE CURRENT_TIMESTAMP on a table without a primary key

    nicht übernommen

    Der Trigger findet die geänderten Zeilen über ihren Primärschlüssel; ohne einen geht das nicht.

    Berichtszeile: on_update_without_key

  • generated columns

    berechnete Spalten, PERSISTED, wenn die Quelle sie speichert

    SQL Server berechnet sie auf dieselben zwei Arten.

  • generated columns with functions SQL Server lacks

    eine normale Spalte

    Eine Formel, die sich nicht für SQL Server schreiben lässt, hinterlässt eine normale Spalte und eine Zeile im Bericht.

    Berichtszeile: generated_not_translated

  • INVISIBLE columns

    normale Spalten

    SQL Server hat keine unsichtbaren Spalten.

    Berichtszeile: invisible_column

  • CHECK constraints

    übersetzt, inline in CREATE TABLE

    Inline-CHECK-Bedingungen werden beim Laden jeder Zeile geprüft.

  • CHECK constraints with functions SQL Server lacks

    nicht angelegt

    Eine CHECK-Bedingung, die sich nicht für SQL Server schreiben lässt, wird weggelassen und gemeldet.

    Berichtszeile: check_skipped

  • CHECK ... NOT ENFORCED

    nicht angelegt

    MySQL behält diese CHECK-Bedingungen, ohne sie anzuwenden, daher können Zeilen sie verletzen.

    Berichtszeile: check_not_enforced

  • defaults with functions SQL Server lacks

    kein Standardwert

    Ein Standardwert, der sich nicht für SQL Server schreiben lässt, wird weggelassen und gemeldet.

    Berichtszeile: default_not_translated

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

    ein Index auf der ganzen Spalte

    SQL Server indiziert ganze Spalten; ein Schlüssel, der auf einem Präfix eindeutig ist, ist es auch auf der ganzen Spalte, daher lädt jede Zeile.

    Berichtszeile: prefix_whole_column

  • FULLTEXT indexes

    nicht angelegt

    Die Volltextsuche von SQL Server braucht einen Katalog und eigene Abfragen.

    Berichtszeile: fulltext_not_created

  • SPATIAL indexes

    nicht angelegt

    Ein räumlicher Index auf einer Geometriespalte braucht einen Begrenzungsrahmen, den der Dump nicht angibt.

    Berichtszeile: spatial_index_not_created

  • functional indexes, and indexes on columns of unlimited length

    nicht angelegt

    SQL Server indiziert weder Ausdrücke noch nvarchar(max)- und varbinary(max)-Spalten.

    Berichtszeile: index_skipped

  • foreign keys

    nach den Daten, WITH NOCHECK, dann geprüft, mit einer Warnung bei verwaisten Zeilen

    Dumps laden mit FOREIGN_KEY_CHECKS=0, und MyISAM prüft nie, daher sind Zeilen ohne Elternzeile häufig. Der Schlüssel wird zuerst angelegt und zuletzt geprüft; verwaiste Zeilen lassen ihn mit einer Warnung ungeprüft, statt das Laden abzubrechen.

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

    NO ACTION

    SQL Server lehnt Kaskaden ab, die eine Tabelle zweimal erreichen könnten; MySQL erlaubt sie.

    Berichtszeile: foreign_key_action_dropped

  • foreign keys to columns without a unique key

    nicht angelegt

    SQL Server braucht einen Primärschlüssel oder einen eindeutigen Index ohne NULL auf den referenzierten Spalten; InnoDB nicht.

    Berichtszeile: foreign_key_skipped

  • table and column names

    wie geschrieben; umbenannt, wenn sie sich nur in der Groß-/Kleinschreibung unterscheiden

    Namen in SQL Server ignorieren unter der üblichen Kollation die Groß-/Kleinschreibung.

    Berichtszeile: identifier_renamed

  • names over 116 characters

    gekürzt

    Namen in SQL Server fassen 128 Zeichen, einige davon für die Nummern, die Namen unterscheidbar halten.

    Berichtszeile: name_shortened

  • GEOMETRY, POINT, POLYGON...

    geometry, mit der SRID jedes Werts

    Der eigene geometry-Typ von SQL Server bewahrt jede Form und ihr räumliches Bezugssystem.

  • INET4, INET6, UUID (MariaDB)

    nvarchar(39), uniqueidentifier

    uniqueidentifier ist die UUID von SQL Server; Adressen bleiben Text.

  • BINARY, VARBINARY, BLOB

    binary, varbinary, varbinary(max)

    Bytes bleiben Bytes.

  • PARTITION BY

    eine Tabelle

    Die Zeilen bleiben dieselben; partitioniere die Tabelle in SQL Server neu, wenn nötig.

    Berichtszeile: partitions_dropped

  • WITH SYSTEM VERSIONING (MariaDB)

    eine Tabelle mit den aktuellen Zeilen

    Ein Dump enthält nur die aktuellen Zeilen.

    Berichtszeile: system_versioning_dropped

  • MyISAM, MEMORY and other engines

    eine normale Tabelle

    SQL Server hat eine einzige Tabellen-Engine.

    Berichtszeile: engine_dropped

  • views, triggers, procedures, functions and events

    im Bericht aufgeführt

    Ihr Code ist in der Sprache von MySQL geschrieben, daher werden sie aufgeführt, damit du sie neu anlegst.

    Berichtszeile: not_converted_objects

  • dumps without CREATE TABLE

    Typen aus den Werten gelesen

    Ein mit --no-create-info erstellter Dump enthält nur Zeilen, daher kommen die Typen aus den Werten.

    Berichtszeile: no_schema

  • geometries in a dump without CREATE TABLE

    geometry

    Das Geometrieformat von MySQL wird an den Werten erkannt.

  • _ci collations

    die Kollation der Datenbank, meist ohne Groß-/Kleinschreibung

    SQL Server vergleicht Text unter seiner üblichen Kollation ohne Groß-/Kleinschreibung, wie _ci in MySQL.

  • SET NAMES utf8 from utf8mb4 tables

    konvertiert, mit einer Warnung

    mysqldump aus MySQL 5.x schreibt standardmäßig 3-Byte-utf8 und ersetzt jedes Emoji durch ein Fragezeichen, bevor ein Konverter die Datei sieht.

    Berichtszeile: dump_lost_four_byte_chars

  • dumps without SET NAMES whose text isn't UTF-8

    als Latin-1 (Windows-1252) gelesen

    latin1 in MySQL ist Windows-1252, die übliche Kodierung solcher Dumps.

    Berichtszeile: charset_guessed

  • sjis, cp932, gbk, big5 dumps

    als UTF-8 gelesen, mit einer Warnung

    Diese Kodierungen werden noch nicht dekodiert.

    Berichtszeile: unsupported_charset

  • UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows

    ausgewertet

    Manche Dump-Werkzeuge schreiben Werte als solche Aufrufe; sie werden als die Werte gelesen, die sie ergeben, wobei geografisches WKT auf Längengrad zuerst umgestellt wird.

  • other expressions in rows

    NULL

    Ein Konverter, der keine Datenbank ausführt, kann sie nicht auswerten.

    Berichtszeile: expression_value

  • DEFAULT in VALUES

    der Standardwert der Spalte

    Ein literaler Standardwert wird in die Zeile kopiert.

    Berichtszeile: default_keyword_filled

  • DEFAULT in VALUES without a literal default

    NULL

    Es gibt keinen Wert zum Kopieren.

    Berichtszeile: default_keyword_null

  • REPLACE and INSERT IGNORE

    normale Zeilen

    Ein Dump hat eine Zeile pro Schlüssel, daher sind die Zeilen dieselben.

    Berichtszeile: replace_as_insert

  • types IntoSQL doesn't know

    nvarchar(max)

    Text nimmt jeden Wert auf; ändere den Typ nach dem Laden.

    Berichtszeile: unknown_type

  • values that don't fit their column

    NULL

    Ein beschädigter oder von Hand geschriebener Dump kann Werte enthalten, die seine Spalte nicht aufnehmen kann; sie werden NULL, damit der Rest lädt.

    Berichtszeile: invalid_value_null

  • unreadable geometries

    NULL

    Bytes, die keine Geometrie sind, lassen sich nicht als solche speichern.

    Berichtszeile: bad_geometry

  • CREATE SEQUENCE (MariaDB)

    CREATE SEQUENCE ... AS bigint, mit ihrem nächsten Wert

    SQL Server hat Sequenzen mit denselben Optionen; jede macht dort weiter, wo der Dump aufgehört hat.

  • VECTOR(n) (MariaDB 11.7+)

    nvarchar(max) mit den Gleitkommazahlen als JSON-Array

    Nur SQL Server 2025 hat einen vector-Typ; ein JSON-Array behält jede Gleitkommazahl auf jeder Version.

    Berichtszeile: type_replaced

In MariaDBIn SQL ServerBerichtszeile
TINYINT(1), BOOLbit, wenn jeder Wert 0 oder 1 ist, sonst smallintMySQLs BOOL ist ein TINYINT(1), das jede Zahl von -128 bis 127 aufnehmen kann. Eine Spalte, die nur 0 und 1 enthält, wird bit; eine mit 2 oder -1 bleibt eine Zahl, damit kein Wert seine Bedeutung ändert.bool_kept_numeric
UNSIGNED integersTINYINT UNSIGNED als tinyint; die anderen als nächstgrößerer Ganzzahltyp mit einem CHECK gegen negative Werte, BIGINT UNSIGNED als bigint, wenn jeder Wert passt, sonst decimal(38,0)SQL Server hat keine vorzeichenlosen Ganzzahlen außer tinyint, das von 0 bis 255 reicht. Ein größerer Typ fasst den ganzen vorzeichenlosen Bereich, und die CHECK-Bedingung hält negative Werte fern wie in MySQL.unsigned_widened
ZEROFILL and display widthsentferntDas Auffüllen mit Nullen ist eine Darstellung der Zahl, kein Teil davon. Die Zahlen bleiben erhalten; formatiere sie beim Lesen, wenn die Auffüllung wichtig ist.zerofill_dropped
FLOAT(M,D)real oder float, ohne die NachkommastellenGleitkommazahlen in SQL Server haben keine feste Skalierung. Die gespeicherten Werte werden unverändert kopiert.float_scale_dropped
DECIMAL(p,s)decimal(p,s) bis 38 Stellen; darüber nvarchardecimal in SQL Server fasst 38 Stellen. Breitere Dezimalzahlen bleiben Text, damit jede Stelle exakt bleibt.decimal_as_text
BIT(1), BIT(n)bit; bigint bis 63 Bit; decimal(20,0) für BIT(64)Ein einzelnes Bit ist ein Ja oder Nein; breitere Bitfelder werden als die Zahl gespeichert, die ihre Bits ergeben.
zero, partial or impossible dates (0000-00-00, 2024-02-30)NULLSQL Server speichert nur echte Kalenderdaten. MySQL behält Null- und unmögliche Datumsangaben, wenn sein SQL-Modus sie erlaubt; sie werden NULL, und der Bericht zählt sie.invalid_date_null
NOT NULL columns with values that become NULLNOT NULL entferntEine Spalte, deren Werte NULL werden mussten, kann NOT NULL nicht behalten, sonst würde das Laden abbrechen.not_null_relaxed
DEFAULT '0000-00-00'kein StandardwertEin Standardwert, den SQL Server nicht speichern kann, wird weggelassen, statt durch ein erfundenes Datum ersetzt zu werden.zero_date_default
TIMEtime, wenn jeder Wert innerhalb eines Tages liegt, sonst nvarcharMySQLs TIME ist eine Dauer von -838:59:59 bis 838:59:59; time in SQL Server ist eine Uhrzeit. Eine Spalte mit längeren oder negativen Werten behält sie als Text.time_as_interval
YEARsmallint mit einem CHECK seines BereichsSQL Server hat keinen Jahrestyp; die CHECK-Bedingung behält dieselben Werte, die MySQL erlaubt.
CHAR(n), VARCHAR(n)nvarchar(n)nvarchar fasst jedes Zeichen auf jeder unterstützten Version, und MySQL gibt CHAR-Werte ohne nachgestellte Leerzeichen zurück, wie nvarchar sie behält.
text with characters past U+FFFF (emoji) in VARCHAR(n)nvarchar(2n), oder nvarchar(max) über 4000nvarchar zählt UTF-16-Einheiten, und ein Emoji belegt zwei, daher bekommt die Spalte Platz für jeden Wert.text_length_widened
DATETIMEdatetime2Ein DATETIME ist eine Uhrzeitangabe ohne Zeitzone, wie datetime2.
TIMESTAMPdatetimeoffset in der Zeitzone, die der Dump angibt, UTC, wenn er keine angibtEin TIMESTAMP ist ein Zeitpunkt. Dumps geben die Zone an, in der sie ihn geschrieben haben (mysqldump schreibt UTC); ohne diese Angabe werden die Werte als UTC gelesen, und der Bericht sagt es.timestamp_zone_assumed
ENUMnvarchar mit einem CHECK der erlaubten WerteText mit einer CHECK-Bedingung behält dieselben Werte.
ENUM holding '' (MySQL's error value)der leere Wert, von der CHECK-Bedingung erlaubtMySQL speichert einen leeren String, wenn in einem nachsichtigen SQL-Modus ein ungültiger Wert in ein ENUM geschrieben wird. Diese Zeilen bleiben erhalten, und die CHECK-Bedingung erlaubt sie.enum_invalid_value
ENUM holding values outside its listkein CHECKWerte, die nicht in der Liste stehen, würden die CHECK-Bedingung verletzen, daher wird sie nicht angelegt.enum_check_skipped
SETnvarchar, wie MySQL es schreibt ('a,b')SQL Server hat keine Arrays; der Text ist der, den MySQL zurückgibt.
JSONnvarchar(max)Die JSON-Funktionen von SQL Server lesen JSON aus Text. Eine CHECK-Bedingung mit ISJSON würde vor SQL Server 2022 skalare Werte wie 1 oder "x" ablehnen, die MySQL behält.
NUL bytes in textbeibehaltennvarchar kann ein NUL-Zeichen enthalten, daher wird der Wert unverändert kopiert.
text that isn't valid in its character setdie fehlerhaften Bytes als ErsatzzeichenText muss als Zeichen gelesen werden, um als nvarchar geschrieben zu werden.invalid_utf8_replaced
text decoded twice (ñ)unverändert kopiertDer Dump enthält genau diese Zeichen, daher werden sie kopiert; der Bericht weist auf sie hin.mojibake_suspected
AUTO_INCREMENTIDENTITY, mit dem Zähler hinter den kopierten IDsDie kopierten IDs laden mit IDENTITY_INSERT, und der Zähler macht nach der höchsten weiter oder nach dem AUTO_INCREMENT des Dumps, je nachdem, was höher ist.
MyISAM AUTO_INCREMENT on the second column of a keyein Zähler für die TabelleMyISAM zählt pro Gruppe der ersten Schlüsselspalte; SQL Server hat einen Zähler pro Tabelle.myisam_group_autoincrement
ON UPDATE CURRENT_TIMESTAMPein Trigger mit AFTER UPDATEDer Trigger setzt die Spalte auf die aktuelle Zeit, wenn eine Änderung sie nicht setzt. Er verknüpft über den Primärschlüssel, daher braucht die Tabelle einen.on_update_trigger
ON UPDATE CURRENT_TIMESTAMP on a table without a primary keynicht übernommenDer Trigger findet die geänderten Zeilen über ihren Primärschlüssel; ohne einen geht das nicht.on_update_without_key
generated columnsberechnete Spalten, PERSISTED, wenn die Quelle sie speichertSQL Server berechnet sie auf dieselben zwei Arten.
generated columns with functions SQL Server lackseine normale SpalteEine Formel, die sich nicht für SQL Server schreiben lässt, hinterlässt eine normale Spalte und eine Zeile im Bericht.generated_not_translated
INVISIBLE columnsnormale SpaltenSQL Server hat keine unsichtbaren Spalten.invisible_column
CHECK constraintsübersetzt, inline in CREATE TABLEInline-CHECK-Bedingungen werden beim Laden jeder Zeile geprüft.
CHECK constraints with functions SQL Server lacksnicht angelegtEine CHECK-Bedingung, die sich nicht für SQL Server schreiben lässt, wird weggelassen und gemeldet.check_skipped
CHECK ... NOT ENFORCEDnicht angelegtMySQL behält diese CHECK-Bedingungen, ohne sie anzuwenden, daher können Zeilen sie verletzen.check_not_enforced
defaults with functions SQL Server lackskein StandardwertEin Standardwert, der sich nicht für SQL Server schreiben lässt, wird weggelassen und gemeldet.default_not_translated
keys and indexes on a prefix, c(20)ein Index auf der ganzen SpalteSQL Server indiziert ganze Spalten; ein Schlüssel, der auf einem Präfix eindeutig ist, ist es auch auf der ganzen Spalte, daher lädt jede Zeile.prefix_whole_column
FULLTEXT indexesnicht angelegtDie Volltextsuche von SQL Server braucht einen Katalog und eigene Abfragen.fulltext_not_created
SPATIAL indexesnicht angelegtEin räumlicher Index auf einer Geometriespalte braucht einen Begrenzungsrahmen, den der Dump nicht angibt.spatial_index_not_created
functional indexes, and indexes on columns of unlimited lengthnicht angelegtSQL Server indiziert weder Ausdrücke noch nvarchar(max)- und varbinary(max)-Spalten.index_skipped
foreign keysnach den Daten, WITH NOCHECK, dann geprüft, mit einer Warnung bei verwaisten ZeilenDumps laden mit FOREIGN_KEY_CHECKS=0, und MyISAM prüft nie, daher sind Zeilen ohne Elternzeile häufig. Der Schlüssel wird zuerst angelegt und zuletzt geprüft; verwaiste Zeilen lassen ihn mit einer Warnung ungeprüft, statt das Laden abzubrechen.
ON DELETE or ON UPDATE that cascades in a cycle or along a second pathNO ACTIONSQL Server lehnt Kaskaden ab, die eine Tabelle zweimal erreichen könnten; MySQL erlaubt sie.foreign_key_action_dropped
foreign keys to columns without a unique keynicht angelegtSQL Server braucht einen Primärschlüssel oder einen eindeutigen Index ohne NULL auf den referenzierten Spalten; InnoDB nicht.foreign_key_skipped
table and column nameswie geschrieben; umbenannt, wenn sie sich nur in der Groß-/Kleinschreibung unterscheidenNamen in SQL Server ignorieren unter der üblichen Kollation die Groß-/Kleinschreibung.identifier_renamed
names over 116 charactersgekürztNamen in SQL Server fassen 128 Zeichen, einige davon für die Nummern, die Namen unterscheidbar halten.name_shortened
GEOMETRY, POINT, POLYGON...geometry, mit der SRID jedes WertsDer eigene geometry-Typ von SQL Server bewahrt jede Form und ihr räumliches Bezugssystem.
INET4, INET6, UUID (MariaDB)nvarchar(39), uniqueidentifieruniqueidentifier ist die UUID von SQL Server; Adressen bleiben Text.
BINARY, VARBINARY, BLOBbinary, varbinary, varbinary(max)Bytes bleiben Bytes.
PARTITION BYeine TabelleDie Zeilen bleiben dieselben; partitioniere die Tabelle in SQL Server neu, wenn nötig.partitions_dropped
WITH SYSTEM VERSIONING (MariaDB)eine Tabelle mit den aktuellen ZeilenEin Dump enthält nur die aktuellen Zeilen.system_versioning_dropped
MyISAM, MEMORY and other engineseine normale TabelleSQL Server hat eine einzige Tabellen-Engine.engine_dropped
views, triggers, procedures, functions and eventsim Bericht aufgeführtIhr Code ist in der Sprache von MySQL geschrieben, daher werden sie aufgeführt, damit du sie neu anlegst.not_converted_objects
dumps without CREATE TABLETypen aus den Werten gelesenEin mit --no-create-info erstellter Dump enthält nur Zeilen, daher kommen die Typen aus den Werten.no_schema
geometries in a dump without CREATE TABLEgeometryDas Geometrieformat von MySQL wird an den Werten erkannt.
_ci collationsdie Kollation der Datenbank, meist ohne Groß-/KleinschreibungSQL Server vergleicht Text unter seiner üblichen Kollation ohne Groß-/Kleinschreibung, wie _ci in MySQL.
SET NAMES utf8 from utf8mb4 tableskonvertiert, mit einer Warnungmysqldump aus MySQL 5.x schreibt standardmäßig 3-Byte-utf8 und ersetzt jedes Emoji durch ein Fragezeichen, bevor ein Konverter die Datei sieht.dump_lost_four_byte_chars
dumps without SET NAMES whose text isn't UTF-8als Latin-1 (Windows-1252) gelesenlatin1 in MySQL ist Windows-1252, die übliche Kodierung solcher Dumps.charset_guessed
sjis, cp932, gbk, big5 dumpsals UTF-8 gelesen, mit einer WarnungDiese Kodierungen werden noch nicht dekodiert.unsupported_charset
UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rowsausgewertetManche Dump-Werkzeuge schreiben Werte als solche Aufrufe; sie werden als die Werte gelesen, die sie ergeben, wobei geografisches WKT auf Längengrad zuerst umgestellt wird.
other expressions in rowsNULLEin Konverter, der keine Datenbank ausführt, kann sie nicht auswerten.expression_value
DEFAULT in VALUESder Standardwert der SpalteEin literaler Standardwert wird in die Zeile kopiert.default_keyword_filled
DEFAULT in VALUES without a literal defaultNULLEs gibt keinen Wert zum Kopieren.default_keyword_null
REPLACE and INSERT IGNOREnormale ZeilenEin Dump hat eine Zeile pro Schlüssel, daher sind die Zeilen dieselben.replace_as_insert
types IntoSQL doesn't knownvarchar(max)Text nimmt jeden Wert auf; ändere den Typ nach dem Laden.unknown_type
values that don't fit their columnNULLEin beschädigter oder von Hand geschriebener Dump kann Werte enthalten, die seine Spalte nicht aufnehmen kann; sie werden NULL, damit der Rest lädt.invalid_value_null
unreadable geometriesNULLBytes, die keine Geometrie sind, lassen sich nicht als solche speichern.bad_geometry
CREATE SEQUENCE (MariaDB)CREATE SEQUENCE ... AS bigint, mit ihrem nächsten WertSQL Server hat Sequenzen mit denselben Optionen; jede macht dort weiter, wo der Dump aufgehört hat.
VECTOR(n) (MariaDB 11.7+)nvarchar(max) mit den Gleitkommazahlen als JSON-ArrayNur SQL Server 2025 hat einen vector-Typ; ein JSON-Array behält jede Gleitkommazahl auf jeder Version.type_replaced

Das Skript in SQL Server laden

Das Skript legt die Tabellen an, kopiert die Zeilen und fügt dann Schlüssel, Indizes und Fremdschlüssel hinzu, so lädt es schnell und hält beim ersten Fehler an.

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

Fremdschlüssel werden mit WITH NOCHECK hinzugefügt und dann geprüft. Verweist eine Zeile auf eine nicht vorhandene Zeile, nennt das Skript den Fremdschlüssel und lässt ihn ungeprüft, statt auf halbem Weg abzubrechen.

Führe bei einem großen Dump sqlcmd auf dem Rechner des Servers aus. Jeder Stapel von bis zu 1000 Zeilen wird einzeln festgeschrieben, so bleibt das Transaktionsprotokoll klein.

Den MariaDB-Dump für das beste Ergebnis erstellen

Der Konverter liest, was der Dump enthält. Mit diesen Optionen bleibt mehr von deinen Daten darin:

  • --default-character-set=utf8mb4 bewahrt Emoji und andere 4-Byte-Zeichen, die ein utf8mb3-Dump verliert, bevor der Konverter ihn sieht.
  • --hex-blob schreibt Binärspalten und VECTOR-Werte hexadezimal, was das Kopieren zwischen Systemen übersteht.
  • --routines --triggers --events fügen diese Objekte dem Dump hinzu, damit der Bericht sie auflisten kann.

Was nicht konvertiert wird

Sichten, Trigger, gespeicherte Prozeduren, Funktionen und Ereignisse sind in der eigenen Sprache von MariaDB geschrieben. Sie stehen mit Namen im Bericht und werden nie stillschweigend weggelassen, damit du sie für SQL Server neu schreiben kannst.

Fragen zu MariaDB zu SQL Server

Keine Antwort gefunden? Schreib uns über die Kontaktseite, und ein Mensch antwortet. Kontaktseite

Wird mein Dump hochgeladen?

Nein. Der Konverter läuft in deinem Browser und liest den Dump stückweise von deiner Festplatte, daher verlässt er nie deinen Computer. Die Desktop-App und die Kommandozeile konvertieren ebenfalls auf deinem Computer.

Wie groß darf der Dump sein?

Der Konverter hält nie den ganzen Dump im Speicher: Er liest die Datei zweimal, in Abschnitten, und schreibt das Skript fortlaufend. Dumps von mehreren Gigabyte werden im Browser, in der Desktop-App und mit der Kommandozeile konvertiert.

Aus welchen MariaDB-Versionen kann der Dump stammen?

Dumps aus mariadb-dump und mysqldump auf MariaDB 10.3 bis 12, mit einem INSERT pro Tabelle oder einem pro Zeile. Jeder Test-Dump stammt aus MariaDB 10.11, 11.4 und 11.8 und wird Zelle für Zelle mit seiner Quelle verglichen.

Bleiben UUID-, INET6-, JSON- und VECTOR-Spalten erhalten?

UUID wird uniqueidentifier, INET-Spalten nvarchar, JSON nvarchar(max) und VECTOR ein JSON-Array seiner Gleitkommazahlen. Null-Daten werden NULL, und der Bericht zählt sie.

Bleiben AUTO_INCREMENT-Werte und Sequenzen erhalten?

Ja. Jede AUTO_INCREMENT-Spalte wird eine IDENTITY-Spalte, die nach der höchsten ID weitermacht. Sequenzen werden SQL Server-Sequenzen, und Standardwerte, die aus einer Sequenz ziehen, ziehen weiter aus ihr.

Was ist mit gespeicherten Prozeduren und Triggern?

Sie stehen mit Namen im Bericht und werden nicht konvertiert, weil jede Datenbank sie in ihrer eigenen Sprache schreibt.

Auf welchen SQL Server-Versionen lädt das Skript?

SQL Server 2017 bis 2025. Dasselbe Skript lädt auf jeder Version und hält beim ersten Fehler an, falls etwas schiefgeht.