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.
18 Zeilen konvertiert, 10 Korrekturen, keine abgelehnt
Tabellen in shop_2024_mariadb.sqlMariaDB-11.8.9-MariaDB-ubu2404-Dump · erstellt mit mariadb-dump · utf8mb4
customers8 Zeilen4
8 Spalten 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 Zeilen6
12 Spalten 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
Korrekturen
- "id" von customers ist vorzeichenlos und wurde deshalb bigint mit einer CHECK-Bedingung gegen negative Werte.
- "name" von customers enthält Zeichen, die SQL Server doppelt zählt, etwa Emoji, daher ist sie nvarchar(200).
- "signed_up" von customers erlaubt jetzt NULL: Einige Werte ließen sich nicht speichern und sind NULL.
- Der Standardwert von "signed_up" in customers, 0000‑00‑00, ist kein Datum, das SQL Server akzeptiert, daher hat die Spalte keinen Standardwert.
- "customer_id" von orders ist vorzeichenlos und wurde deshalb bigint mit einer CHECK-Bedingung gegen negative Werte.
- "id" von orders ist vorzeichenlos und wurde deshalb bigint mit einer CHECK-Bedingung gegen negative Werte.
- "items" von orders ist vorzeichenlos und wurde deshalb int mit einer CHECK-Bedingung gegen negative Werte.
- "note" von orders enthält Zeichen, die SQL Server doppelt zählt, etwa Emoji, daher ist sie nvarchar(510).
- 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.
- "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 MariaDB | In SQL Server | Berichtszeile |
|---|---|---|
| TINYINT(1), BOOL | bit, 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 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. | unsigned_widened |
| ZEROFILL and display widths | entferntDas 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 NULL | NOT 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 |
| TIME | time, 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 |
| YEAR | smallint 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 |
| DATETIME | datetime2Ein DATETIME ist eine Uhrzeitangabe ohne Zeitzone, wie datetime2. | |
| TIMESTAMP | datetimeoffset 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 |
| ENUM | nvarchar 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 list | kein CHECKWerte, die nicht in der Liste stehen, würden die CHECK-Bedingung verletzen, daher wird sie nicht angelegt. | 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 | beibehaltennvarchar 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 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_INCREMENT | IDENTITY, 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 key | ein 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_TIMESTAMP | ein 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 key | nicht übernommenDer Trigger findet die geänderten Zeilen über ihren Primärschlüssel; ohne einen geht das nicht. | on_update_without_key |
| generated columns | berechnete Spalten, PERSISTED, wenn die Quelle sie speichertSQL Server berechnet sie auf dieselben zwei Arten. | |
| generated columns with functions SQL Server lacks | eine 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 columns | normale 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 lacks | nicht angelegtEine CHECK-Bedingung, die sich nicht für SQL Server schreiben lässt, wird weggelassen und gemeldet. | check_skipped |
| CHECK ... NOT ENFORCED | nicht angelegtMySQL behält diese CHECK-Bedingungen, ohne sie anzuwenden, daher können Zeilen sie verletzen. | check_not_enforced |
| defaults with functions SQL Server lacks | kein 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 indexes | nicht angelegtDie Volltextsuche von SQL Server braucht einen Katalog und eigene Abfragen. | fulltext_not_created |
| SPATIAL indexes | nicht 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 length | nicht angelegtSQL Server indiziert weder Ausdrücke noch nvarchar(max)- und varbinary(max)-Spalten. | index_skipped |
| foreign keys | nach 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 path | NO 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 key | nicht 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 names | wie 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 characters | gekü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, BLOB | binary, varbinary, varbinary(max)Bytes bleiben Bytes. | |
| PARTITION BY | eine 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 engines | eine normale TabelleSQL Server hat eine einzige Tabellen-Engine. | engine_dropped |
| views, triggers, procedures, functions and events | im 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 TABLE | Typen 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 TABLE | geometryDas Geometrieformat von MySQL wird an den Werten erkannt. | |
| _ci collations | die 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 tables | konvertiert, 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-8 | als Latin-1 (Windows-1252) gelesenlatin1 in MySQL ist Windows-1252, die übliche Kodierung solcher Dumps. | charset_guessed |
| sjis, cp932, gbk, big5 dumps | als UTF-8 gelesen, mit einer WarnungDiese Kodierungen werden noch nicht dekodiert. | unsupported_charset |
| UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows | ausgewertetManche 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 | NULLEin Konverter, der keine Datenbank ausführt, kann sie nicht auswerten. | expression_value |
| DEFAULT in VALUES | der Standardwert der SpalteEin literaler Standardwert wird in die Zeile kopiert. | default_keyword_filled |
| DEFAULT in VALUES without a literal default | NULLEs gibt keinen Wert zum Kopieren. | default_keyword_null |
| REPLACE and INSERT IGNORE | normale ZeilenEin Dump hat eine Zeile pro Schlüssel, daher sind die Zeilen dieselben. | replace_as_insert |
| types IntoSQL doesn't know | nvarchar(max)Text nimmt jeden Wert auf; ändere den Typ nach dem Laden. | unknown_type |
| values that don't fit their column | NULLEin 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 geometries | NULLBytes, 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.sqlFremdschlü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.