---
title: "在浏览器中将 SQL Server 迁移到 MySQL"
description: "将 SQL Server 数据库迁移到 MySQL：把 SSMS 生成的脚本转换为表、键和数据相同的脚本，并报告每项更改。"
canonical: https://intosql.com/zh-cn/sql-server-to-mysql
last_updated: 2026-10-15
---

# 在浏览器中将 SQL Server 迁移到 MySQL

拖入 SSMS 的"生成脚本"写出的包含架构和数据的脚本（.sql 或 .sql.gz，UTF-16 或 UTF-8），即可下载包含相同表、键、索引和数据的 MySQL 脚本。MySQL 无法原样存储的每个值，以及它不支持的每个对象，都会在报告中列出。

[SQL Server 到 MySQL 迁移指南](https://intosql.com/docs/migrations/sql-server-to-mysql)

[SQL Server 到 MySQL 的数据类型](https://intosql.com/docs/types/sql-server-to-mysql)

## 从 SQL Server 到 MySQL 的变化

每一行是转换器应用的一条规则，以及该规则更改你的数据时在报告中写入的记录。

| 在 SQL Server 中 | 在 MySQL 中 | 报告记录 |
| --- | --- | --- |
| bit | tinyint(1) |  |
| char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), text | char(n)，不超过 1024 个字符时为 varchar(n)，更长则为 text 类型 |  |
| decimal(p,s), money, smallmoney | decimal(p,s)；money 为 decimal(19,4) |  |
| datetime, datetime2, smalldatetime | datetime(p) |  |
| datetime2(7), time(7) and datetimeoffset(7) | 秒保留六位小数，第七位截断 | `fraction_cut` |
| datetimeoffset | UTC 的 datetime(p) | `moments_as_utc` |
| time | time(p) |  |
| dates before the year 1000 | NULL | `date_out_of_range` |
| json (SQL Server 2025) | json |  |
| uniqueidentifier | char(36) |  |
| binary, varbinary, image | binary(n)、varbinary(n) 和 blob 类型 |  |
| geometry, geography | blob，存放 SQL Server 自己的字节 | `spatial_as_native` |
| rowversion, timestamp | blob，空 | `rowversion_empty` |
| xml, sql_variant, hierarchyid, vector | longtext | `type_replaced` |
| collations that ignore case (_CI_) | 精确比较（utf8mb4_bin） | `case_insensitive_collation` |
| IDENTITY | AUTO_INCREMENT，从最大的 id 之后继续 |  |
| IDENTITY columns that don't lead the primary key | 普通整数 | `counter_dropped` |
| CREATE SEQUENCE | 不创建 | `sequence_not_converted` |
| computed columns | 生成列，PERSISTED 时为 STORED，否则为 VIRTUAL |  |
| computed columns with functions MySQL lacks | 普通列 | `generated_not_translated` |
| defaults with functions MySQL lacks, and NEXT VALUE FOR | 无默认值 | `default_not_translated` |
| CHECK constraints | 已转换 |  |
| CHECK constraints with functions MySQL lacks | 不创建 | `check_skipped` |
| CHECK constraints added WITH NOCHECK or disabled | 不创建 | `check_not_enforced` |
| filtered and columnstore indexes | 不创建 | `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 | 单个表，包含每个分区的行 | `partitions_dropped` |
| temporal tables (SYSTEM_VERSIONING) | 两个表：当前行和历史记录 | `system_versioning_dropped` |
| schemas | 单个数据库，每个表名前加上其 schema 名 | `schemas_merged` |
| NOT NULL columns with values that become NULL | 去除 NOT NULL | `not_null_relaxed` |
| views, functions, procedures, triggers, synonyms, types and partition functions | 在报告中列出 | `not_converted_objects` |
| scripts without CREATE TABLE (data only) | 根据值推断类型 | `no_schema` |
| expressions in INSERT values | NULL | `expression_value` |
| types IntoSQL doesn't know | longtext | `unknown_type` |
| NUL characters in text | 保留 |  |
| text that isn't valid in its encoding | 错误的字节变为替换字符 | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | 按原样复制 | `mojibake_suspected` |

## 将脚本导入 MySQL

脚本先创建表、复制行，再添加键、索引和外键，因此导入速度快，并会在遇到第一个错误时停止。

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

外键按转储中的声明创建，导入行时使用 FOREIGN_KEY_CHECKS=0，因此指向不存在的行的行不会中止导入。

对于较大的转储，请在服务器所在的机器上运行客户端；如果单行非常大，请调高 max_allowed_packet。

IntoSQL Pro 可以通过桌面应用或命令行将文件直接导入 MySQL，无需生成脚本。

## 如何转储 SQL Server 以获得最佳结果

转换器读取转储中的内容。以下选项能让转储保留更多数据：

- 在 SSMS 中右键单击数据库，依次选择"任务"、"生成脚本"，然后选择表。dbatools、mssql-scripter 以及其他基于同一库的工具也会写出相同的脚本。
- 在"高级"中，将"要编写脚本的数据的类型"设为"架构和数据"。只含架构的脚本中，表没有行。
- 以 SSMS 默认的 Unicode 或 UTF-8 保存：两者的读取方式相同，也支持 gzip。

## 哪些内容不会转换

视图、函数、存储过程、触发器、同义词、规则和安全策略都是用 T-SQL 编写的。它们会按名称在报告中列出，绝不会被悄悄丢弃，以便你为 MySQL 重写。

## 关于 SQL Server 转 MySQL 的问题

### 我的转储会被上传吗？

不会。转换器在你的浏览器中运行，分块从磁盘读取转储，因此转储不会离开你的电脑。桌面应用和命令行也在你的电脑上转换。

### 转储可以多大？

转换器从不把整个转储放进内存：它按范围读取文件两次，边读边写出脚本。几 GB 的转储可以在浏览器、桌面应用和命令行中转换。

### 它能读取 SSMS 保存的 UTF-16 文件吗？

能。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 变为 UTC 的 datetime。schema 在单个数据库中变为表名前缀。不区分大小写的列改为精确比较，报告会说明是哪些列。

### 存储过程、触发器和视图怎么处理？

它们会按名称在报告中列出，但不会转换，因为每种数据库都用自己的语言编写它们。

### 脚本可以导入哪些 MySQL 版本？

MySQL 5.7 及更高版本。每个测试脚本都能在 5.7 和 9 上导入，如有问题会在第一个错误处停止。

## 从 SQL Server

- [SQL Server 到 PostgreSQL](https://intosql.com/zh-cn/sql-server-to-postgresql)
- [SQL Server 到 MariaDB](https://intosql.com/zh-cn/sql-server-to-mariadb)
- [SQL Server 到 SQLite](https://intosql.com/zh-cn/sql-server-to-sqlite)
- [SQL Server 到 SQL Server](https://intosql.com/zh-cn/sql-server-to-sql-server)
- [SQL Server 到 Oracle](https://intosql.com/zh-cn/sql-server-to-oracle)

## 到 MySQL

- [MySQL 到 MySQL](https://intosql.com/zh-cn/mysql-to-mysql)
- [MariaDB 到 MySQL](https://intosql.com/zh-cn/mariadb-to-mysql)
- [PostgreSQL 到 MySQL](https://intosql.com/zh-cn/postgresql-to-mysql)
- [SQLite 到 MySQL](https://intosql.com/zh-cn/sqlite-to-mysql)
- [Oracle 到 MySQL](https://intosql.com/zh-cn/oracle-to-mysql)

## 指南和所有组合

- [MySQL 到 SQL Server](https://intosql.com/zh-cn/mysql-to-sql-server)
- [SQL Server 到 MySQL 迁移指南](https://intosql.com/docs/migrations/sql-server-to-mysql)
- [SQL Server 到 MySQL 的数据类型](https://intosql.com/docs/types/sql-server-to-mysql)
- [所有数据库组合](https://intosql.com/zh-cn/database-migration)
