Перейти к содержимому
Главная страница IntoSQL

Конвертация SQL Server в MySQL

Перетащите скрипт, который Generate Scripts в SSMS записывает со схемой и данными, в формате .sql или .sql.gz, в UTF-16 или UTF-8, и скачайте скрипт MySQL с теми же таблицами, ключами, индексами и данными. Каждое значение, которое MySQL не может хранить как есть, и каждый объект, который он не переносит, указаны в отчете.

Ваш файл
sqlshop_2024_sqlserver.sqlПример файла, 11 кБ
Ваша база данных

18 строк конвертировано, 3 исправления, ни одна не отклонена

Показать

Таблицы в shop_2024_sqlserver.sqlДамп SQL Server · создан программой SQL Server Management Objects · utf-8

  • orders10 строк1
    11 столбцов
    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 строк2
    8 столбцов
    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

Не конвертировано

  • Представление 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;

Исправления

  1. "shipped_at" таблицы orders имеет тип datetime2(7), в нем больше цифр долей секунды, чем хранит MySQL, поэтому это datetime(6), а последние цифры отбрасываются.
  2. "created_at" таблицы customers содержит моменты времени с часовым поясом; в MySQL нет типа, который его сохраняет, поэтому они хранятся в UTC как datetime.
  3. "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Строка отчета
bittinyint(1)BOOLEAN в MySQL - это TINYINT(1): 1 и 0, как их хранит bit.
char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), textchar(n), varchar(n) до 1024 символов, дальше типы textТекст хранит каждый символ в utf8mb4. Столбец в ключе - не больше varchar(768), это максимум, который вмещает ключ; то же касается текста со значением по умолчанию, которое MySQL 5.7 допускает только для varchar.
decimal(p,s), money, smallmoneydecimal(p,s); money как decimal(19,4)decimal вмещает 65 цифр, больше, чем 38 в SQL Server, поэтому каждое значение точное.
datetime, datetime2, smalldatetimedatetime(p)datetime в обеих базах - это показание часов.
datetime2(7), time(7) and datetimeoffset(7)шесть цифр долей секунды, седьмая отбрасываетсяMySQL хранит микросекунды; седьмая цифра (100 наносекунд) отбрасывается, а не округляется, поэтому ни одно значение не переходит на следующую секунду или день.fraction_cut
datetimeoffsetdatetime(p) в UTCTIMESTAMP в MySQL доходит только до 2038 года, поэтому моменты хранятся как datetime в UTC: тот же момент, какое бы смещение ни было у значения.moments_as_utc
timetime(p)То же время суток.
dates before the year 1000NULLMySQL хранит годы с 1000 по 9999, а SQL Server - начиная с 1 года. Такие значения становятся NULL, и отчет их подсчитывает.date_out_of_range
json (SQL Server 2025)jsonТе же значения JSON, которые читают функции JSON в MySQL.
uniqueidentifierchar(36)Те же идентификаторы, записанные строчными буквами.
binary, varbinary, imagebinary(n), varbinary(n) и типы blobБайты остаются байтами.
geometry, geographyblob с собственными байтами SQL ServerSSMS записывает пространственные значения в сериализации SQL Server, которая сохраняется байт в байт.spatial_as_native
rowversion, timestampblob, пустойSQL Server сам задает версию строки, и SSMS не записывает для нее значений.rowversion_empty
xml, sql_variant, hierarchyid, vectorlongtextВ 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
IDENTITYAUTO_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 NULLNOT 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 valuesNULLКонвертер, который не запускает базу данных, не может их вычислить.expression_value
types IntoSQL doesn't knowlongtextТип 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 и останавливается на первой ошибке, если что-то пойдет не так.