Конвертация SQL Server в MySQL
Перетащите скрипт, который Generate Scripts в SSMS записывает со схемой и данными, в формате .sql или .sql.gz, в UTF-16 или UTF-8, и скачайте скрипт MySQL с теми же таблицами, ключами, индексами и данными. Каждое значение, которое MySQL не может хранить как есть, и каждый объект, который он не переносит, указаны в отчете.
18 строк конвертировано, 3 исправления, ни одна не отклонена
Таблицы в shop_2024_sqlserver.sqlДамп SQL Server · создан программой SQL Server Management Objects · utf-8
orders10 строк1
11 столбцов id int not null customer_id int not null status varchar(10) not null total decimal(19,4) not null items tinyint unsigned not null 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) customers8 строк2
8 столбцов id int not null name varchar(100) not null email varchar(200) not null country char(2) not null is_active tinyint(1) not null signed_up date created_at datetime not null row_version blob
Не конвертировано
- Представление paid_orders
- Триггер orders_no_negative
Каждая база данных пишет их на своем языке. Перепишите их для MySQL.
-- 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;
Исправления
- "shipped_at" таблицы orders имеет тип datetime2(7), в нем больше цифр долей секунды, чем хранит MySQL, поэтому это datetime(6), а последние цифры отбрасываются.
- "created_at" таблицы customers содержит моменты времени с часовым поясом; в MySQL нет типа, который его сохраняет, поэтому они хранятся в UTC как datetime.
- "row_version" таблицы customers - это версия строки, которую SQL Server задает сам; в дампе нет ее значений, поэтому это blob, и столбец пуст.
Требует проверки
- 6 текстовых столбцов сравнивают значения без учета регистра в источнике; MySQL сравнивает точно, поэтому уникальные ключи и поиск могут работать иначе. Используйте сопоставление или тип столбца без учета регистра для столбцов, которым это нужно.
- Не конвертированы представления, триггеры, процедуры и события (2 объекта); отчет перечисляет каждый. Создайте их заново вручную в MySQL.
- Проверку check1 таблицы orders нельзя записать для MySQL (function isjson), поэтому она не создана. Запишите проверку вручную, если она важна.
- Индекс idx_orders_pending таблицы orders использует выражение, которое нельзя записать для MySQL (neither MySQL 5.7 nor MariaDB index an expression), поэтому он не создан. Создайте индекс вручную, если он нужен запросам.
- Значение по умолчанию столбца "order_ref" таблицы orders нельзя записать для MySQL (a default expression needs MySQL 8.0.13), поэтому у столбца его нет. Добавьте значение по умолчанию вручную, если оно нужно новым строкам.
Файл конвертируется на этом компьютере и никуда не загружается.
Другие примеры:
Что меняется при переходе с SQL Server на MySQL
Каждая строка - это правило, которое применяет конвертер, и строка отчета, которую он пишет, когда правило что-то меняет в ваших данных.
bit
tinyint(1)
BOOLEAN в MySQL - это TINYINT(1): 1 и 0, как их хранит bit.
char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), text
char(n), varchar(n) до 1024 символов, дальше типы text
Текст хранит каждый символ в utf8mb4. Столбец в ключе - не больше varchar(768), это максимум, который вмещает ключ; то же касается текста со значением по умолчанию, которое MySQL 5.7 допускает только для varchar.
decimal(p,s), money, smallmoney
decimal(p,s); money как decimal(19,4)
decimal вмещает 65 цифр, больше, чем 38 в SQL Server, поэтому каждое значение точное.
datetime, datetime2, smalldatetime
datetime(p)
datetime в обеих базах - это показание часов.
datetime2(7), time(7) and datetimeoffset(7)
шесть цифр долей секунды, седьмая отбрасывается
MySQL хранит микросекунды; седьмая цифра (100 наносекунд) отбрасывается, а не округляется, поэтому ни одно значение не переходит на следующую секунду или день.
Строка отчета: fraction_cut
datetimeoffset
datetime(p) в UTC
TIMESTAMP в MySQL доходит только до 2038 года, поэтому моменты хранятся как datetime в UTC: тот же момент, какое бы смещение ни было у значения.
Строка отчета: moments_as_utc
time
time(p)
То же время суток.
dates before the year 1000
NULL
MySQL хранит годы с 1000 по 9999, а SQL Server - начиная с 1 года. Такие значения становятся NULL, и отчет их подсчитывает.
Строка отчета: date_out_of_range
json (SQL Server 2025)
json
Те же значения JSON, которые читают функции JSON в MySQL.
uniqueidentifier
char(36)
Те же идентификаторы, записанные строчными буквами.
binary, varbinary, image
binary(n), varbinary(n) и типы blob
Байты остаются байтами.
geometry, geography
blob с собственными байтами SQL Server
SSMS записывает пространственные значения в сериализации SQL Server, которая сохраняется байт в байт.
Строка отчета: spatial_as_native
rowversion, timestamp
blob, пустой
SQL Server сам задает версию строки, и SSMS не записывает для нее значений.
Строка отчета: rowversion_empty
xml, sql_variant, hierarchyid, vector
longtext
В MySQL нет равнозначного типа; xml и sql_variant сохраняют текст каждого значения, а hierarchyid - свой путь, например /1/2/.
Строка отчета: type_replaced
collations that ignore case (_CI_)
точное сравнение (utf8mb4_bin)
Таблицы используют utf8mb4_bin, поэтому уникальные ключи различают то, что различал SQL Server; столбцы, которые не учитывали регистр, это теряют. Правила для диакритики отличаются в разных версиях, поэтому ни одна сортировка _ci не совпадает с SQL Server во всех из них.
Строка отчета: case_insensitive_collation
IDENTITY
AUTO_INCREMENT, продолжается после наибольшего id
Нумеруется первый столбец первичного ключа; счетчик продолжается после наибольшего id.
IDENTITY columns that don't lead the primary key
обычное целое
MySQL нумерует один столбец на таблицу, в начале ключа; любой другой сохраняет значения без счетчика.
Строка отчета: counter_dropped
CREATE SEQUENCE
не создается
В MySQL нет последовательностей. Значения, которые выдала последовательность, уже есть в строках.
Строка отчета: sequence_not_converted
computed columns
генерируемые столбцы, STORED при PERSISTED, иначе VIRTUAL
MySQL вычисляет их теми же двумя способами, а CONCAT записан так, чтобы NULL считался пустой строкой, как в SQL Server.
computed columns with functions MySQL lacks
обычный столбец
Формула, которую нельзя записать, оставляет обычный столбец и строку в отчете; SSMS не записывает значения вычисляемых столбцов.
Строка отчета: generated_not_translated
defaults with functions MySQL lacks, and NEXT VALUE FOR
без значения по умолчанию
Значение по умолчанию, которое нельзя записать, опускается и попадает в отчет.
Строка отчета: default_not_translated
CHECK constraints
переводится
MySQL 5.7 хранит их без проверки; остальные применяют их при загрузке каждой строки.
CHECK constraints with functions MySQL lacks
не создается
Проверка, которую нельзя записать, опускается и попадает в отчет.
Строка отчета: check_skipped
CHECK constraints added WITH NOCHECK or disabled
не создается
SQL Server не применяет эти проверки, поэтому строки могут их нарушать.
Строка отчета: check_not_enforced
filtered and columnstore indexes
не создается
IntoSQL создает индексы b-tree по целым столбцам; остальные создайте заново после загрузки.
Строка отчета: index_skipped
foreign keys
внешние ключи, загрузка с FOREIGN_KEY_CHECKS=0
Строки загружаются в любом порядке, а ключи затем проверяют новые строки.
foreign keys to tables the dump doesn't create
не создается
Ключ не может ссылаться на таблицу, которой нет.
Строка отчета: foreign_key_skipped
tables on a partition scheme
одна таблица со строками всех секций
Строки те же; при необходимости секционируйте таблицу заново в MySQL.
Строка отчета: partitions_dropped
temporal tables (SYSTEM_VERSIONING)
две таблицы: текущие строки и история
Таблица и ее таблица истории копируются как обычные таблицы; MySQL не ведет историю сам.
Строка отчета: system_versioning_dropped
schemas
одна база данных, имя таблицы начинается с имени ее схемы
Схемы в MySQL - это базы данных, а скрипт, загружаемый в одну базу, не может их создать; таблицы из dbo сохраняют свои имена.
Строка отчета: schemas_merged
NOT NULL columns with values that become NULL
NOT NULL снимается
Столбец, значения которого пришлось заменить на NULL, не может сохранить NOT NULL, иначе загрузка остановится.
Строка отчета: not_null_relaxed
views, functions, procedures, triggers, synonyms, types and partition functions
перечисляются в отчете
Их код написан на T-SQL, поэтому они перечислены, чтобы вы создали их заново.
Строка отчета: not_converted_objects
scripts without CREATE TABLE (data only)
типы определяются по значениям
Скрипт только с данными содержит лишь строки, поэтому типы берутся из значений.
Строка отчета: no_schema
expressions in INSERT values
NULL
Конвертер, который не запускает базу данных, не может их вычислить.
Строка отчета: expression_value
types IntoSQL doesn't know
longtext
Тип text вмещает любое значение; измените тип после загрузки.
Строка отчета: unknown_type
NUL characters in text
сохраняется
Значение копируется, а символ NUL в нем экранируется.
text that isn't valid in its encoding
неверные байты заменяются символом замены
Скрипт в UTF-8, и каждое значение должно быть корректным текстом.
Строка отчета: invalid_utf8_replaced
text decoded twice (ñ)
копируется как есть
Скрипт содержит именно эти символы, поэтому они копируются; отчет на них указывает.
Строка отчета: mojibake_suspected
| В SQL Server | В MySQL | Строка отчета |
|---|---|---|
| bit | tinyint(1)BOOLEAN в MySQL - это TINYINT(1): 1 и 0, как их хранит bit. | |
| char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), text | char(n), varchar(n) до 1024 символов, дальше типы textТекст хранит каждый символ в utf8mb4. Столбец в ключе - не больше varchar(768), это максимум, который вмещает ключ; то же касается текста со значением по умолчанию, которое MySQL 5.7 допускает только для varchar. | |
| decimal(p,s), money, smallmoney | decimal(p,s); money как decimal(19,4)decimal вмещает 65 цифр, больше, чем 38 в SQL Server, поэтому каждое значение точное. | |
| datetime, datetime2, smalldatetime | datetime(p)datetime в обеих базах - это показание часов. | |
| datetime2(7), time(7) and datetimeoffset(7) | шесть цифр долей секунды, седьмая отбрасываетсяMySQL хранит микросекунды; седьмая цифра (100 наносекунд) отбрасывается, а не округляется, поэтому ни одно значение не переходит на следующую секунду или день. | fraction_cut |
| datetimeoffset | datetime(p) в UTCTIMESTAMP в MySQL доходит только до 2038 года, поэтому моменты хранятся как datetime в UTC: тот же момент, какое бы смещение ни было у значения. | moments_as_utc |
| time | time(p)То же время суток. | |
| dates before the year 1000 | NULLMySQL хранит годы с 1000 по 9999, а SQL Server - начиная с 1 года. Такие значения становятся NULL, и отчет их подсчитывает. | date_out_of_range |
| json (SQL Server 2025) | jsonТе же значения JSON, которые читают функции JSON в MySQL. | |
| uniqueidentifier | char(36)Те же идентификаторы, записанные строчными буквами. | |
| binary, varbinary, image | binary(n), varbinary(n) и типы blobБайты остаются байтами. | |
| geometry, geography | blob с собственными байтами SQL ServerSSMS записывает пространственные значения в сериализации SQL Server, которая сохраняется байт в байт. | spatial_as_native |
| rowversion, timestamp | blob, пустойSQL Server сам задает версию строки, и SSMS не записывает для нее значений. | rowversion_empty |
| xml, sql_variant, hierarchyid, vector | longtextВ MySQL нет равнозначного типа; xml и sql_variant сохраняют текст каждого значения, а hierarchyid - свой путь, например /1/2/. | type_replaced |
| collations that ignore case (_CI_) | точное сравнение (utf8mb4_bin)Таблицы используют utf8mb4_bin, поэтому уникальные ключи различают то, что различал SQL Server; столбцы, которые не учитывали регистр, это теряют. Правила для диакритики отличаются в разных версиях, поэтому ни одна сортировка _ci не совпадает с SQL Server во всех из них. | case_insensitive_collation |
| IDENTITY | AUTO_INCREMENT, продолжается после наибольшего idНумеруется первый столбец первичного ключа; счетчик продолжается после наибольшего id. | |
| IDENTITY columns that don't lead the primary key | обычное целоеMySQL нумерует один столбец на таблицу, в начале ключа; любой другой сохраняет значения без счетчика. | counter_dropped |
| CREATE SEQUENCE | не создаетсяВ MySQL нет последовательностей. Значения, которые выдала последовательность, уже есть в строках. | sequence_not_converted |
| computed columns | генерируемые столбцы, STORED при PERSISTED, иначе VIRTUALMySQL вычисляет их теми же двумя способами, а CONCAT записан так, чтобы NULL считался пустой строкой, как в SQL Server. | |
| computed columns with functions MySQL lacks | обычный столбецФормула, которую нельзя записать, оставляет обычный столбец и строку в отчете; SSMS не записывает значения вычисляемых столбцов. | generated_not_translated |
| defaults with functions MySQL lacks, and NEXT VALUE FOR | без значения по умолчаниюЗначение по умолчанию, которое нельзя записать, опускается и попадает в отчет. | default_not_translated |
| CHECK constraints | переводитсяMySQL 5.7 хранит их без проверки; остальные применяют их при загрузке каждой строки. | |
| CHECK constraints with functions MySQL lacks | не создаетсяПроверка, которую нельзя записать, опускается и попадает в отчет. | check_skipped |
| CHECK constraints added WITH NOCHECK or disabled | не создаетсяSQL Server не применяет эти проверки, поэтому строки могут их нарушать. | check_not_enforced |
| filtered and columnstore indexes | не создаетсяIntoSQL создает индексы b-tree по целым столбцам; остальные создайте заново после загрузки. | index_skipped |
| foreign keys | внешние ключи, загрузка с FOREIGN_KEY_CHECKS=0Строки загружаются в любом порядке, а ключи затем проверяют новые строки. | |
| foreign keys to tables the dump doesn't create | не создаетсяКлюч не может ссылаться на таблицу, которой нет. | foreign_key_skipped |
| tables on a partition scheme | одна таблица со строками всех секцийСтроки те же; при необходимости секционируйте таблицу заново в MySQL. | partitions_dropped |
| temporal tables (SYSTEM_VERSIONING) | две таблицы: текущие строки и историяТаблица и ее таблица истории копируются как обычные таблицы; MySQL не ведет историю сам. | system_versioning_dropped |
| schemas | одна база данных, имя таблицы начинается с имени ее схемыСхемы в MySQL - это базы данных, а скрипт, загружаемый в одну базу, не может их создать; таблицы из dbo сохраняют свои имена. | schemas_merged |
| NOT NULL columns with values that become NULL | NOT NULL снимаетсяСтолбец, значения которого пришлось заменить на NULL, не может сохранить NOT NULL, иначе загрузка остановится. | not_null_relaxed |
| views, functions, procedures, triggers, synonyms, types and partition functions | перечисляются в отчетеИх код написан на T-SQL, поэтому они перечислены, чтобы вы создали их заново. | not_converted_objects |
| scripts without CREATE TABLE (data only) | типы определяются по значениямСкрипт только с данными содержит лишь строки, поэтому типы берутся из значений. | no_schema |
| expressions in INSERT values | NULLКонвертер, который не запускает базу данных, не может их вычислить. | expression_value |
| types IntoSQL doesn't know | longtextТип text вмещает любое значение; измените тип после загрузки. | unknown_type |
| NUL characters in text | сохраняетсяЗначение копируется, а символ NUL в нем экранируется. | |
| text that isn't valid in its encoding | неверные байты заменяются символом заменыСкрипт в UTF-8, и каждое значение должно быть корректным текстом. | invalid_utf8_replaced |
| text decoded twice (ñ) | копируется как естьСкрипт содержит именно эти символы, поэтому они копируются; отчет на них указывает. | mojibake_suspected |
Загрузите скрипт в MySQL
Скрипт создает таблицы, копирует строки, затем добавляет ключи, индексы и внешние ключи, поэтому загрузка идет быстро и останавливается на первой ошибке.
mysql --default-character-set=utf8mb4 mydb < sql_server.mysql.sqlВнешние ключи создаются так, как их объявляет дамп, с FOREIGN_KEY_CHECKS=0 на время загрузки строк, поэтому строка, которая ссылается на отсутствующую строку, не останавливает загрузку.
Для большого дампа запускайте клиент на той же машине, где работает сервер, и увеличьте max_allowed_packet, если отдельная строка очень большая.
IntoSQL Pro загружает файл прямо в MySQL из приложения для компьютера или командной строки, без написания скрипта.
Как создать дамп SQL Server для лучшего результата
Конвертер читает то, что есть в дампе. Эти параметры сохраняют в нем больше ваших данных:
- В SSMS щелкните базу данных правой кнопкой, выберите Tasks, Generate Scripts и отметьте таблицы. dbatools, mssql-scripter и другие инструменты на той же библиотеке пишут такой же скрипт.
- В разделе Advanced задайте для Types of data to script значение Schema and data. Скрипт только со схемой содержит таблицы без строк.
- Сохраните его в Unicode, как по умолчанию в SSMS, или в UTF-8: оба читаются одинаково, gzip тоже подходит.
Что не конвертируется
Представления, функции, процедуры, триггеры, синонимы, правила и политики безопасности написаны на T-SQL. Они перечислены в отчете по имени и никогда не удаляются молча, чтобы вы могли переписать их для MySQL.
Вопросы о SQL Server в MySQL
Нет ответа на ваш вопрос? Напишите нам через страницу контактов, и вам ответит человек. Страница контактов
Мой дамп загружается на сервер?
Нет. Конвертер работает в вашем браузере и читает дамп с диска по частям, поэтому он никогда не покидает ваш компьютер. Приложение для компьютера и командная строка тоже конвертируют на вашем компьютере.
Насколько большим может быть дамп?
Конвертер никогда не держит весь дамп в памяти: он читает файл дважды, по диапазонам, и пишет скрипт по ходу чтения. Дампы в несколько гигабайт конвертируются в браузере, в приложении для компьютера и в командной строке.
Читает ли он файл UTF-16, который сохраняет SSMS?
Да. SSMS по умолчанию сохраняет скрипты в UTF-16, а конвертер одинаково читает UTF-16 и UTF-8, сжатые gzip или нет, с GO между пакетами.
Из каких версий SQL Server может быть скрипт?
Скрипты, которые SSMS, dbatools или mssql-scripter пишут из SQL Server 2017 и новее. Каждый тестовый скрипт создан в SQL Server 2017, 2022 и 2025 и сверен с источником ячейка за ячейкой.
Сохраняются ли значения IDENTITY?
Да, для одного столбца на таблицу: столбец IDENTITY, с которого начинается первичный ключ, становится AUTO_INCREMENT и продолжается после наибольшего id. Последовательности не создаются, потому что в MySQL их нет, и отчет это отмечает.
Что происходит с money, datetimeoffset и другими типами SQL Server?
bit становится tinyint(1), money - decimal(19,4), uniqueidentifier - char(36), а datetimeoffset - datetime в UTC. Схемы становятся префиксами имен таблиц в одной базе данных. Столбцы, которые не учитывали регистр, сравниваются точно, и отчет указывает, какие именно.
А процедуры, триггеры и представления?
Они перечислены в отчете по имени и не конвертируются, потому что каждая база данных пишет их на своем языке.
На каких версиях MySQL загружается скрипт?
MySQL 5.7 и новее. Каждый тестовый скрипт загружается на 5.7 и 9 и останавливается на первой ошибке, если что-то пойдет не так.