Zum Inhalt springen
IntoSQL-Startseite

SQL Server in MySQL umwandeln

Leg das Skript ab, das Generate Scripts in SSMS mit Schema und Daten schreibt, als .sql oder .sql.gz, UTF-16 oder UTF-8, und lade ein MySQL-Skript mit denselben Tabellen, Schlüsseln, Indizes und Daten herunter. Jeder Wert, den MySQL nicht unverändert aufnehmen kann, und jedes Objekt, das es nicht übernimmt, steht im Bericht.

Deine Datei
sqlshop_2024_sqlserver.sqlBeispieldatei, 11 kB
Deine Datenbank

18 Zeilen konvertiert, 3 Korrekturen, keine abgelehnt

Anzeigen

Tabellen in shop_2024_sqlserver.sqlSQL Server-Dump · erstellt mit SQL Server Management Objects · utf-8

  • orders10 Zeilen1
    11 Spalten
    idint not null
    customer_idint not null
    statusvarchar(10) not null
    totaldecimal(19,4) not null
    itemstinyint unsigned not null
    ordered_atdatetime not null
    shipped_atdatetime(6)
    notetext
    detailstext
    order_refchar(36) not null
    total_with_taxdecimal(12,2)
  • customers8 Zeilen2
    8 Spalten
    idint not null
    namevarchar(100) not null
    emailvarchar(200) not null
    countrychar(2) not null
    is_activetinyint(1) not null
    signed_update
    created_atdatetime not null
    row_versionblob

Nicht konvertiert

  • Sicht paid_orders
  • Trigger orders_no_negative

Jede Datenbank schreibt diese in ihrer eigenen Sprache. Schreib sie für MySQL neu.

-- Written by IntoSQL from a SQL Server dump. Load it with: mysql --default-character-set=utf8mb4 <database> < <file>
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO,ALLOW_INVALID_DATES';

CREATE TABLE `orders` (
  `id` int NOT NULL AUTO_INCREMENT,
  `customer_id` int NOT NULL,
  `status` varchar(10) NOT NULL DEFAULT 'pending',
  `total` decimal(19,4) NOT NULL,
  `items` tinyint unsigned NOT NULL DEFAULT 1,
  `ordered_at` datetime NOT NULL,
  `shipped_at` datetime(6),
  `note` text,
  `details` text,
  `order_ref` char(36) NOT NULL,
  `total_with_tax` decimal(12,2) GENERATED ALWAYS AS (cast(`total` * (1.16) AS DECIMAL(12,2))) STORED,
  PRIMARY KEY (`id`),
  KEY `idx_orders_customer` (`customer_id`),
  KEY `idx_orders_status_date` (`status`,`ordered_at`),
  CONSTRAINT `check2` CHECK (`status` = 'cancelled' OR `status` = 'shipped' OR `status` = 'paid' OR `status` = 'pending'),
  CONSTRAINT `check3` CHECK (`total` >= (0)),
  FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`)
) AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

CREATE TABLE `customers` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `email` varchar(200) NOT NULL,
  `country` char(2) NOT NULL DEFAULT 'US',
  `is_active` tinyint(1) NOT NULL DEFAULT 1,
  `signed_up` date,
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `row_version` blob,
  PRIMARY KEY (`id`),
  UNIQUE KEY (`email`)
) AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='People who bought at least once';

INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (1,'Ana Martínez','ana@example.com','MX',1,'2023-01-15','2023-01-15 10:24:00.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (2,'Zoë Müller','zoe@example.de','DE',1,'2023-02-03','2023-02-03 08:11:42.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (3,'José Peña','jose@example.es','ES',0,'2023-03-21','2023-03-21 19:05:17.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (4,'李雷','lilei@example.cn','CN',1,'2023-05-09','2023-05-09 02:40:00.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (5,'Noah O\'Brien','noah@example.ie','IE',1,NULL,'2023-06-30 14:00:00.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (6,'Amélie Laurent','amelie@example.fr','FR',1,'2024-01-02','2024-01-02 09:30:00.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (7,'Ravi Patel','ravi@example.in','IN',0,'2024-02-29','2024-02-29 23:59:59.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (8,'Sofia Rossi 🌻','sofia@example.it','IT',1,'2024-04-12','2024-04-12 12:12:12.000000');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (1,1,'shipped',129.9000,3,'2024-03-01T10:00:00.000000','2024-03-02T16:30:00.123456',NULL,'{"gift": false}','0b7a4c2e-3f1d-4e8a-9c55-1a2b3c4d5e6f');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (2,2,'paid',54.0000,1,'2024-03-02T11:15:00.000000',NULL,'Gift wrap 🎁','{"gift": true, "wrap": "red"}','1c8b5d3f-4a2e-4f9b-8d66-2b3c4d5e6f70');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (3,1,'cancelled',12.5000,1,'2024-03-03T09:45:00.000000',NULL,'Customer changed their mind',NULL,'2d9c6e4a-5b3f-4a0c-9e77-3c4d5e6f7081');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (4,4,'shipped',980.0000,12,'2024-03-05T02:10:00.000000','2024-03-07T08:00:00.000000','请小心轻放','{"fragile": true}','3e0d7f5b-6c4a-4b1d-8f88-4d5e6f708192');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (5,5,'pending',45.7500,2,'2024-03-08T17:20:00.000000',NULL,'Leave at the door; ring twice',NULL,'4f1e806c-7d5b-4c2e-9a99-5e6f708192a3');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (6,6,'shipped',310.4000,5,'2024-03-10T13:00:00.000000','2024-03-11T09:00:00.000000','Fragile: "glass"','{"fragile": true}','50f2917d-8e6c-4d3f-8baa-6f708192a3b4');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (7,8,'paid',76.2000,2,'2024-03-11T18:45:00.000000',NULL,NULL,NULL,'6103a28e-9f7d-4e40-9cbb-708192a3b4c5');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (8,2,'shipped',19.9900,1,'2024-03-12T08:00:00.000000','9999-12-31T23:59:59.999999','Shipped date set to the maximum by an old import',NULL,'7214b39f-a08e-4f51-8dcc-8192a3b4c5d6');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (9,3,'shipped',64.0000,2,'2024-03-14T15:30:00.000000','2024-03-15T10:00:00.000000','Two parcels','{"parcels": [1, 2]}','8325c4a0-b19f-4062-9edd-92a3b4c5d6e7');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (10,7,'paid',1499.0000,1,'2024-03-15T21:05:00.000000',NULL,'C:\\Users\\ravi\\invoice.pdf',NULL,'9436d5b1-c2a0-4173-8fee-a3b4c5d6e7f8');

SET UNIQUE_CHECKS = 1;
SET FOREIGN_KEY_CHECKS = 1;

Korrekturen

  1. "shipped_at" von orders ist datetime2(7), mit mehr Sekundenstellen, als MySQL behält, daher ist es datetime(6) und die letzten Stellen werden abgeschnitten.
  2. "created_at" von customers enthält Zeitpunkte mit Zeitzone; MySQL hat keinen Typ, der eine behält, daher werden sie in UTC als datetime gespeichert.
  3. "row_version" von customers ist eine Zeilenversion, die SQL Server selbst setzt; der Dump hat keine Werte dafür, daher ist es blob und leer.

Zu prüfen

  • 6 Textspalten vergleichen in der Quelle ohne Rücksicht auf Groß- und Kleinschreibung; MySQL vergleicht exakt, daher können sich eindeutige Schlüssel und Suchen anders verhalten. Nutze eine Collation oder einen Spaltentyp ohne Unterscheidung der Groß- und Kleinschreibung für die Spalten, die das brauchen.
  • 2 Sichten, Trigger, Routinen oder Ereignisse werden nicht konvertiert; der Bericht listet sie einzeln auf. Lege sie in MySQL von Hand neu an.
  • Die CHECK-Bedingung check1 auf orders lässt sich nicht für MySQL schreiben (function isjson), daher wird sie nicht angelegt. Schreib die CHECK-Bedingung von Hand, wenn sie wichtig ist.
  • Der Index idx_orders_pending auf orders nutzt einen Ausdruck, der sich nicht für MySQL schreiben lässt (neither MySQL 5.7 nor MariaDB index an expression), daher wird er nicht angelegt. Lege den Index von Hand an, wenn Abfragen ihn brauchen.
  • Der Standardwert von "order_ref" in orders lässt sich nicht für MySQL schreiben (a default expression needs MySQL 8.0.13), daher hat die Spalte keinen Standardwert. Füge den Standardwert von Hand hinzu, wenn neue Zeilen ihn brauchen.

Deine Datei wird auf diesem Computer umgewandelt und nie hochgeladen.

Weitere Beispiele:

Was sich von SQL Server zu MySQL ändert

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

  • bit

    tinyint(1)

    BOOLEAN in MySQL ist TINYINT(1): 1 und 0, wie bit sie speichert.

  • char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), text

    char(n), varchar(n) bis 1024 Zeichen, darüber text-Typen

    Text behält jedes Zeichen als utf8mb4. Eine Spalte in einem Schlüssel ist höchstens varchar(768), das Längste, was ein Schlüssel fasst, und ebenso Text mit Standardwert, den MySQL 5.7 nur varchar gibt.

  • decimal(p,s), money, smallmoney

    decimal(p,s); money als decimal(19,4)

    decimal fasst 65 Stellen, mehr als die 38 von SQL Server, daher ist jeder Wert exakt.

  • datetime, datetime2, smalldatetime

    datetime(p)

    Ein datetime ist in beiden eine Uhrzeitangabe ohne Zeitzone.

  • datetime2(7), time(7) and datetimeoffset(7)

    sechs Sekundenstellen, die siebte abgeschnitten

    MySQL behält Mikrosekunden; die siebte Stelle (100 Nanosekunden) wird abgeschnitten, nie gerundet, damit kein Wert in die nächste Sekunde oder den nächsten Tag rutscht.

    Berichtszeile: fraction_cut

  • datetimeoffset

    datetime(p) in UTC

    TIMESTAMP in MySQL reicht nur bis 2038, daher werden Zeitpunkte als datetime in UTC gespeichert: derselbe Zeitpunkt, welchen Versatz jeder Wert auch hatte.

    Berichtszeile: moments_as_utc

  • time

    time(p)

    Dieselben Uhrzeiten.

  • dates before the year 1000

    NULL

    MySQL speichert die Jahre 1000 bis 9999, und SQL Server reicht bis zum Jahr 1 zurück. Diese Werte werden NULL, und der Bericht zählt sie.

    Berichtszeile: date_out_of_range

  • json (SQL Server 2025)

    json

    Dieselben JSON-Werte, die die JSON-Funktionen von MySQL lesen.

  • uniqueidentifier

    char(36)

    Dieselben Kennungen, in Kleinbuchstaben geschrieben.

  • binary, varbinary, image

    binary(n), varbinary(n) und blob-Typen

    Bytes bleiben Bytes.

  • geometry, geography

    blob mit den eigenen Bytes von SQL Server

    SSMS schreibt räumliche Werte in der Serialisierung von SQL Server, die Byte für Byte erhalten bleibt.

    Berichtszeile: spatial_as_native

  • rowversion, timestamp

    blob, leer

    SQL Server setzt eine Zeilenversion selbst, und SSMS schreibt keine Werte dafür ins Skript.

    Berichtszeile: rowversion_empty

  • xml, sql_variant, hierarchyid, vector

    longtext

    MySQL hat keinen entsprechenden Typ; xml und sql_variant behalten den Text jedes Werts und hierarchyid seinen Pfad, etwa /1/2/.

    Berichtszeile: type_replaced

  • collations that ignore case (_CI_)

    exakter Vergleich (utf8mb4_bin)

    Tabellen nutzen utf8mb4_bin, damit eindeutige Schlüssel trennen, was SQL Server getrennt hat; Spalten, die die Groß-/Kleinschreibung ignorierten, verlieren das. Akzentregeln unterscheiden sich je nach Version, daher entspricht keine _ci-Collation in jeder der von SQL Server.

    Berichtszeile: case_insensitive_collation

  • IDENTITY

    AUTO_INCREMENT, weiter nach der höchsten ID

    Die Spalte am Anfang des Primärschlüssels zählt; der Zähler macht nach der höchsten ID weiter.

  • IDENTITY columns that don't lead the primary key

    eine normale Ganzzahl

    MySQL zählt eine Spalte pro Tabelle, am Anfang eines Schlüssels; jede andere behält ihre Werte ohne Zähler.

    Berichtszeile: counter_dropped

  • CREATE SEQUENCE

    nicht angelegt

    MySQL hat keine Sequenzen. Die Werte, die eine Sequenz vergeben hat, stehen in den Zeilen.

    Berichtszeile: sequence_not_converted

  • computed columns

    generierte Spalten, STORED bei PERSISTED, sonst VIRTUAL

    MySQL berechnet sie auf dieselben zwei Arten, mit CONCAT so geschrieben, dass NULL wie in SQL Server als leer zählt.

  • computed columns with functions MySQL lacks

    eine normale Spalte

    Eine Formel, die sich nicht schreiben lässt, hinterlässt eine normale Spalte und eine Zeile im Bericht; SSMS schreibt keine Werte für berechnete Spalten ins Skript.

    Berichtszeile: generated_not_translated

  • defaults with functions MySQL lacks, and NEXT VALUE FOR

    kein Standardwert

    Ein Standardwert, der sich nicht schreiben lässt, wird weggelassen und gemeldet.

    Berichtszeile: default_not_translated

  • CHECK constraints

    übersetzt

    MySQL 5.7 behält sie, ohne sie zu prüfen; die anderen prüfen sie beim Laden jeder Zeile.

  • CHECK constraints with functions MySQL lacks

    nicht angelegt

    Eine CHECK-Bedingung, die sich nicht schreiben lässt, wird weggelassen und gemeldet.

    Berichtszeile: check_skipped

  • CHECK constraints added WITH NOCHECK or disabled

    nicht angelegt

    SQL Server wendet diese CHECK-Bedingungen nicht an, daher können die Zeilen sie verletzen.

    Berichtszeile: check_not_enforced

  • filtered and columnstore indexes

    nicht angelegt

    IntoSQL schreibt B-Tree-Indizes auf ganzen Spalten; lege die anderen nach dem Laden neu an.

    Berichtszeile: index_skipped

  • foreign keys

    Fremdschlüssel, geladen mit FOREIGN_KEY_CHECKS=0

    Die Zeilen laden in beliebiger Reihenfolge, und die Schlüssel prüfen danach neue Zeilen.

  • foreign keys to tables the dump doesn't create

    nicht angelegt

    Ein Schlüssel kann nicht auf eine Tabelle verweisen, die es nicht gibt.

    Berichtszeile: foreign_key_skipped

  • tables on a partition scheme

    eine Tabelle mit den Zeilen aller Partitionen

    Die Zeilen sind dieselben; partitioniere die Tabelle in MySQL neu, wenn nötig.

    Berichtszeile: partitions_dropped

  • temporal tables (SYSTEM_VERSIONING)

    zwei Tabellen: die aktuellen Zeilen und die Historie

    Die Tabelle und ihre Historientabelle werden als normale Tabellen kopiert; MySQL führt die Historie nicht selbst.

    Berichtszeile: system_versioning_dropped

  • schemas

    eine Datenbank, jede Tabelle mit dem Namen ihres Schemas vorangestellt

    Schemas sind in MySQL Datenbanken, die ein in eine Datenbank geladenes Skript nicht anlegen kann; Tabellen in dbo behalten ihre Namen.

    Berichtszeile: schemas_merged

  • 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

  • views, functions, procedures, triggers, synonyms, types and partition functions

    im Bericht aufgeführt

    Ihr Code ist in T-SQL geschrieben, daher werden sie aufgeführt, damit du sie neu anlegst.

    Berichtszeile: not_converted_objects

  • scripts without CREATE TABLE (data only)

    Typen aus den Werten gelesen

    Ein Skript nur mit Daten enthält nur Zeilen, daher kommen die Typen aus den Werten.

    Berichtszeile: no_schema

  • expressions in INSERT values

    NULL

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

    Berichtszeile: expression_value

  • types IntoSQL doesn't know

    longtext

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

    Berichtszeile: unknown_type

  • NUL characters in text

    erhalten

    Der Wert wird mit maskiertem NUL-Zeichen kopiert.

  • text that isn't valid in its encoding

    die fehlerhaften Bytes als Ersatzzeichen

    Das Skript ist UTF-8, und jeder Wert muss gültiger Text sein.

    Berichtszeile: invalid_utf8_replaced

  • text decoded twice (ñ)

    unverändert kopiert

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

    Berichtszeile: mojibake_suspected

In SQL ServerIn MySQLBerichtszeile
bittinyint(1)BOOLEAN in MySQL ist TINYINT(1): 1 und 0, wie bit sie speichert.
char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), textchar(n), varchar(n) bis 1024 Zeichen, darüber text-TypenText behält jedes Zeichen als utf8mb4. Eine Spalte in einem Schlüssel ist höchstens varchar(768), das Längste, was ein Schlüssel fasst, und ebenso Text mit Standardwert, den MySQL 5.7 nur varchar gibt.
decimal(p,s), money, smallmoneydecimal(p,s); money als decimal(19,4)decimal fasst 65 Stellen, mehr als die 38 von SQL Server, daher ist jeder Wert exakt.
datetime, datetime2, smalldatetimedatetime(p)Ein datetime ist in beiden eine Uhrzeitangabe ohne Zeitzone.
datetime2(7), time(7) and datetimeoffset(7)sechs Sekundenstellen, die siebte abgeschnittenMySQL behält Mikrosekunden; die siebte Stelle (100 Nanosekunden) wird abgeschnitten, nie gerundet, damit kein Wert in die nächste Sekunde oder den nächsten Tag rutscht.fraction_cut
datetimeoffsetdatetime(p) in UTCTIMESTAMP in MySQL reicht nur bis 2038, daher werden Zeitpunkte als datetime in UTC gespeichert: derselbe Zeitpunkt, welchen Versatz jeder Wert auch hatte.moments_as_utc
timetime(p)Dieselben Uhrzeiten.
dates before the year 1000NULLMySQL speichert die Jahre 1000 bis 9999, und SQL Server reicht bis zum Jahr 1 zurück. Diese Werte werden NULL, und der Bericht zählt sie.date_out_of_range
json (SQL Server 2025)jsonDieselben JSON-Werte, die die JSON-Funktionen von MySQL lesen.
uniqueidentifierchar(36)Dieselben Kennungen, in Kleinbuchstaben geschrieben.
binary, varbinary, imagebinary(n), varbinary(n) und blob-TypenBytes bleiben Bytes.
geometry, geographyblob mit den eigenen Bytes von SQL ServerSSMS schreibt räumliche Werte in der Serialisierung von SQL Server, die Byte für Byte erhalten bleibt.spatial_as_native
rowversion, timestampblob, leerSQL Server setzt eine Zeilenversion selbst, und SSMS schreibt keine Werte dafür ins Skript.rowversion_empty
xml, sql_variant, hierarchyid, vectorlongtextMySQL hat keinen entsprechenden Typ; xml und sql_variant behalten den Text jedes Werts und hierarchyid seinen Pfad, etwa /1/2/.type_replaced
collations that ignore case (_CI_)exakter Vergleich (utf8mb4_bin)Tabellen nutzen utf8mb4_bin, damit eindeutige Schlüssel trennen, was SQL Server getrennt hat; Spalten, die die Groß-/Kleinschreibung ignorierten, verlieren das. Akzentregeln unterscheiden sich je nach Version, daher entspricht keine _ci-Collation in jeder der von SQL Server.case_insensitive_collation
IDENTITYAUTO_INCREMENT, weiter nach der höchsten IDDie Spalte am Anfang des Primärschlüssels zählt; der Zähler macht nach der höchsten ID weiter.
IDENTITY columns that don't lead the primary keyeine normale GanzzahlMySQL zählt eine Spalte pro Tabelle, am Anfang eines Schlüssels; jede andere behält ihre Werte ohne Zähler.counter_dropped
CREATE SEQUENCEnicht angelegtMySQL hat keine Sequenzen. Die Werte, die eine Sequenz vergeben hat, stehen in den Zeilen.sequence_not_converted
computed columnsgenerierte Spalten, STORED bei PERSISTED, sonst VIRTUALMySQL berechnet sie auf dieselben zwei Arten, mit CONCAT so geschrieben, dass NULL wie in SQL Server als leer zählt.
computed columns with functions MySQL lackseine normale SpalteEine Formel, die sich nicht schreiben lässt, hinterlässt eine normale Spalte und eine Zeile im Bericht; SSMS schreibt keine Werte für berechnete Spalten ins Skript.generated_not_translated
defaults with functions MySQL lacks, and NEXT VALUE FORkein StandardwertEin Standardwert, der sich nicht schreiben lässt, wird weggelassen und gemeldet.default_not_translated
CHECK constraintsübersetztMySQL 5.7 behält sie, ohne sie zu prüfen; die anderen prüfen sie beim Laden jeder Zeile.
CHECK constraints with functions MySQL lacksnicht angelegtEine CHECK-Bedingung, die sich nicht schreiben lässt, wird weggelassen und gemeldet.check_skipped
CHECK constraints added WITH NOCHECK or disablednicht angelegtSQL Server wendet diese CHECK-Bedingungen nicht an, daher können die Zeilen sie verletzen.check_not_enforced
filtered and columnstore indexesnicht angelegtIntoSQL schreibt B-Tree-Indizes auf ganzen Spalten; lege die anderen nach dem Laden neu an.index_skipped
foreign keysFremdschlüssel, geladen mit FOREIGN_KEY_CHECKS=0Die Zeilen laden in beliebiger Reihenfolge, und die Schlüssel prüfen danach neue Zeilen.
foreign keys to tables the dump doesn't createnicht angelegtEin Schlüssel kann nicht auf eine Tabelle verweisen, die es nicht gibt.foreign_key_skipped
tables on a partition schemeeine Tabelle mit den Zeilen aller PartitionenDie Zeilen sind dieselben; partitioniere die Tabelle in MySQL neu, wenn nötig.partitions_dropped
temporal tables (SYSTEM_VERSIONING)zwei Tabellen: die aktuellen Zeilen und die HistorieDie Tabelle und ihre Historientabelle werden als normale Tabellen kopiert; MySQL führt die Historie nicht selbst.system_versioning_dropped
schemaseine Datenbank, jede Tabelle mit dem Namen ihres Schemas vorangestelltSchemas sind in MySQL Datenbanken, die ein in eine Datenbank geladenes Skript nicht anlegen kann; Tabellen in dbo behalten ihre Namen.schemas_merged
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
views, functions, procedures, triggers, synonyms, types and partition functionsim Bericht aufgeführtIhr Code ist in T-SQL geschrieben, daher werden sie aufgeführt, damit du sie neu anlegst.not_converted_objects
scripts without CREATE TABLE (data only)Typen aus den Werten gelesenEin Skript nur mit Daten enthält nur Zeilen, daher kommen die Typen aus den Werten.no_schema
expressions in INSERT valuesNULLEin Konverter, der keine Datenbank ausführt, kann sie nicht auswerten.expression_value
types IntoSQL doesn't knowlongtextText nimmt jeden Wert auf; ändere den Typ nach dem Laden.unknown_type
NUL characters in texterhaltenDer Wert wird mit maskiertem NUL-Zeichen kopiert.
text that isn't valid in its encodingdie fehlerhaften Bytes als ErsatzzeichenDas Skript ist UTF-8, und jeder Wert muss gültiger Text sein.invalid_utf8_replaced
text decoded twice (ñ)unverändert kopiertDas Skript enthält genau diese Zeichen, daher werden sie kopiert; der Bericht weist auf sie hin.mojibake_suspected

Das Skript in MySQL 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.

mysql --default-character-set=utf8mb4 mydb < sql_server.mysql.sql

Fremdschlüssel werden so angelegt, wie der Dump sie deklariert, mit FOREIGN_KEY_CHECKS=0, während die Zeilen laden, daher hält eine Zeile, die auf eine fehlende Zeile verweist, das Laden nicht an.

Führe bei einem großen Dump den Client auf dem Rechner des Servers aus und erhöhe max_allowed_packet, wenn eine einzelne Zeile sehr groß ist.

IntoSQL Pro lädt die Datei aus der Desktop-App oder der Kommandozeile direkt in MySQL, ohne ein Skript zu schreiben.

Den SQL Server-Dump für das beste Ergebnis erstellen

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

  • Klicke in SSMS mit der rechten Maustaste auf die Datenbank, dann auf Tasks, Generate Scripts, und wähle die Tabellen. dbatools, mssql-scripter und andere Werkzeuge auf Basis derselben Bibliothek schreiben dasselbe Skript.
  • Setze unter Advanced die Option Types of data to script auf Schema and data. Ein Skript nur mit dem Schema hat Tabellen ohne Zeilen.
  • Speichere es als Unicode, den Standard von SSMS, oder als UTF-8: Beides wird gleich gelesen, und gzip funktioniert auch.

Was nicht konvertiert wird

Sichten, Funktionen, Prozeduren, Trigger, Synonyme, Regeln und Sicherheitsrichtlinien sind in T-SQL geschrieben. Sie stehen mit Namen im Bericht und werden nie stillschweigend weggelassen, damit du sie für MySQL neu schreiben kannst.

Fragen zu SQL Server zu MySQL

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.

Liest es die UTF-16-Datei, die SSMS speichert?

Ja. SSMS speichert Skripte standardmäßig als UTF-16, und der Konverter liest UTF-16 und UTF-8 gleichermaßen, gezippt oder nicht, mit GO zwischen den Batches.

Aus welchen SQL Server-Versionen kann das Skript stammen?

Skripte, die SSMS, dbatools oder mssql-scripter ab SQL Server 2017 schreiben. Jedes Test-Skript stammt aus SQL Server 2017, 2022 und 2025 und wird Zelle für Zelle mit seiner Quelle verglichen.

Bleiben IDENTITY-Werte erhalten?

Ja, für eine Spalte pro Tabelle: Die IDENTITY-Spalte am Anfang des Primärschlüssels wird AUTO_INCREMENT und macht nach der höchsten ID weiter. Sequenzen werden nicht angelegt, weil MySQL keine hat, und der Bericht vermerkt das.

Was passiert mit money, datetimeoffset und anderen SQL Server-Typen?

bit wird tinyint(1), money decimal(19,4), uniqueidentifier char(36) und datetimeoffset datetime in UTC. Schemas werden Präfixe der Tabellennamen in einer Datenbank. Spalten, die Groß-/Kleinschreibung ignorierten, vergleichen exakt, und der Bericht nennt sie.

Was ist mit Prozeduren, Triggern und Sichten?

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

Auf welchen MySQL-Versionen lädt das Skript?

MySQL 5.7 und neuer. Jedes Test-Skript lädt auf 5.7 und 9 und hält beim ersten Fehler an, falls etwas schiefgeht.