如何修改数据库默认字符集为UTF-8?
- 内容介绍
- 文章标签
- 相关推荐
一、什么是数据库默认字符集?
常见的默认字符集有:
-
MySQL这方面,
latin1→utf8mb4 -
SQL Server:
SQL_Latin1_General_CP1_CI_AS -
PostgreSQL:
UTF8 -
再看Oracle。
AL32UTF8 -
MongoDB:
UTF8
至于使用者痛点,
- 乱码问题:跨语言、跨网站的数据在读取时出现“?,?,”或乱码。
- 迁移失败:从旧程序迁移数据后部分文字丢失或显示错误。
- 性能疑虑:担心改为 UTF‑8 会导致存储空间膨胀或查询变慢。
- 兼容性风险:应用层连接字符串、ORM 配置未同步导致异常。
二、为什么要把默认字符集改为 UTF‑8?
全语言支持:UTF‑8 能完整表示 Unicode,涵盖中文、日文、韩文、表情符等所有字符。
避免数据损失:使用单字节 latin1 时非 Latin 字符会被截断或转换成问号。
统一标准:大多数现代框架和第三方服务默认采用 UTF‑8,保持一致可减少调试成本。
三、修改前的准备工作
-
备份全库数据:
MYSQlDump -u root -p --all-databases> all_backup.sql -
确认业务低峰期:
- 检查现有字符集冲突:
- 准备好回滚方案:
- 检查现有字符集冲突:
四、修改全局字符集设置
a) 修改 my.cnf配置文件
# /etc/mysql/my.cnf
default-character-set=utf8mb4
default-character-set=utf8mb4
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake
b) 通过 SQL 动态修改
# 设置全局变量
SET GLOBAL character_set_server = 'utf8mb4';SET GLOBAL collation_server = 'utf8mb4_unicode_ci';# 设置会话变量
SET SESSION character_set_connection = 'utf8mb4';SET SESSION character_set_results = 'utf8mb4';SET SESSION character_set_client = 'utf8mb4';
五、创建新库时直接指定 UTF‑8 编码
六、修改已存在的数据库字符集与排序规则
a) 单库改名方式——先导出再导入
-
mydb.sql
-
Edit SQL 文件。将所有
`CREATE DATABASE` 和 `CREATE TABLE` 的 charset/collation 替换为 'utf8mb4'/'utf8mb4_unicode_ci'.
-
Create 新库并导入:
-
If you cannot afford downtime,see “在线转换”章节。
b) 在线转换单库
mydb.sql
`CREATE DATABASE` 和 `CREATE TABLE` 的 charset/collation 替换为 'utf8mb4'/'utf8mb4_unicode_ci'.
先修改数据库默认字符集:
遍历所有表并逐一转换:
将上述查询结果复制为批量执行的 SQL,即可一次性完成全部表的字符集升级。说到注意,InnoDB 表在转换期间会锁定。建议分批执行或在维护窗口进行。
b-1) 转换单个表示例
unicodeci;
b-2) 转换列级别
ALTER TABLE orders MODIFY COLUMN note VARCHAR CHARACTER SET utf8mb4 COLLATE utf8mb4unicodeci;
七、验证转换是否成功
-
查看库/表/列的实际 charset:
SELECT TABLE_SCHEMA。TABLE_NAME,COLUMN_NAME,CHARACTER_SET_NAME,COLLATION_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='mydb' AND CHARACTER_SET_NAME!='utf8mb4',如果返回为空,则说明全部已转为 UTF‑8。 -
检查业务层面是否仍有乱码:
- 监控磁盘占用变化:
八、常见问题与方法
| # 问题场景 | 解决思路 |
|---|---|
| ① 表结构中仍残留 latin1 列 | - 使用上面的 “列级别转换” 命令逐列升级 - 若字段较多。可生成动态 SQL 自动化处理 |
mysql --default-character-set=utf8mb4 -u root -p dbname
CREATE INDEX idxname ON tab);或者把 innodblarge_prefix=ON 并使用 DYNAMIC/COMPRESSED 行格式
jdbc:mysql://host:3306/db?useUnicode=true&characterEncoding=utf-8&characterSetResults=utf-eight - 对于 PHP PDO:添加 "charset=utf8mb4";怎么说呢,- 对于 .NET:在 connection string 中加入 "Charset=utf-eight";确保所有客户端统一使用 utf‑eight。
九、要点
-
li>明确痛点:乱码、迁移风险和性能安全是最常见的三大阻碍。li>一步到位:先改全局 server charset。再逐库/表/列转码,最终同步应用层配置。li>安全第一:完整备份 + 低峰期操作 + 回滚预案是必不可少的保障。li>验证闭环:SHOW VARIABLES 、INFORMATION_SCHEMA 查询 + 业务抽样确保真正完成。/ ul
通过以上步骤。你可以把 MySQL的默认字符集安全地切换为 UTF‑9 84,从根本上杜绝乱码,让跨语言业务顺畅运行。老实说,
一、什么是数据库默认字符集?
常见的默认字符集有:
-
MySQL这方面,
latin1→utf8mb4 -
SQL Server:
SQL_Latin1_General_CP1_CI_AS -
PostgreSQL:
UTF8 -
再看Oracle。
AL32UTF8 -
MongoDB:
UTF8
至于使用者痛点,
- 乱码问题:跨语言、跨网站的数据在读取时出现“?,?,”或乱码。
- 迁移失败:从旧程序迁移数据后部分文字丢失或显示错误。
- 性能疑虑:担心改为 UTF‑8 会导致存储空间膨胀或查询变慢。
- 兼容性风险:应用层连接字符串、ORM 配置未同步导致异常。
二、为什么要把默认字符集改为 UTF‑8?
全语言支持:UTF‑8 能完整表示 Unicode,涵盖中文、日文、韩文、表情符等所有字符。
避免数据损失:使用单字节 latin1 时非 Latin 字符会被截断或转换成问号。
统一标准:大多数现代框架和第三方服务默认采用 UTF‑8,保持一致可减少调试成本。
三、修改前的准备工作
-
备份全库数据:
MYSQlDump -u root -p --all-databases> all_backup.sql -
确认业务低峰期:
- 检查现有字符集冲突:
- 准备好回滚方案:
- 检查现有字符集冲突:
四、修改全局字符集设置
a) 修改 my.cnf配置文件
# /etc/mysql/my.cnf
default-character-set=utf8mb4
default-character-set=utf8mb4
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake
b) 通过 SQL 动态修改
# 设置全局变量
SET GLOBAL character_set_server = 'utf8mb4';SET GLOBAL collation_server = 'utf8mb4_unicode_ci';# 设置会话变量
SET SESSION character_set_connection = 'utf8mb4';SET SESSION character_set_results = 'utf8mb4';SET SESSION character_set_client = 'utf8mb4';
五、创建新库时直接指定 UTF‑8 编码
六、修改已存在的数据库字符集与排序规则
a) 单库改名方式——先导出再导入
-
mydb.sql
-
Edit SQL 文件。将所有
`CREATE DATABASE` 和 `CREATE TABLE` 的 charset/collation 替换为 'utf8mb4'/'utf8mb4_unicode_ci'.
-
Create 新库并导入:
-
If you cannot afford downtime,see “在线转换”章节。
b) 在线转换单库
mydb.sql
`CREATE DATABASE` 和 `CREATE TABLE` 的 charset/collation 替换为 'utf8mb4'/'utf8mb4_unicode_ci'.
先修改数据库默认字符集:
遍历所有表并逐一转换:
将上述查询结果复制为批量执行的 SQL,即可一次性完成全部表的字符集升级。说到注意,InnoDB 表在转换期间会锁定。建议分批执行或在维护窗口进行。
b-1) 转换单个表示例
unicodeci;
b-2) 转换列级别
ALTER TABLE orders MODIFY COLUMN note VARCHAR CHARACTER SET utf8mb4 COLLATE utf8mb4unicodeci;
七、验证转换是否成功
-
查看库/表/列的实际 charset:
SELECT TABLE_SCHEMA。TABLE_NAME,COLUMN_NAME,CHARACTER_SET_NAME,COLLATION_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='mydb' AND CHARACTER_SET_NAME!='utf8mb4',如果返回为空,则说明全部已转为 UTF‑8。 -
检查业务层面是否仍有乱码:
- 监控磁盘占用变化:
八、常见问题与方法
| # 问题场景 | 解决思路 |
|---|---|
| ① 表结构中仍残留 latin1 列 | - 使用上面的 “列级别转换” 命令逐列升级 - 若字段较多。可生成动态 SQL 自动化处理 |
mysql --default-character-set=utf8mb4 -u root -p dbname
CREATE INDEX idxname ON tab);或者把 innodblarge_prefix=ON 并使用 DYNAMIC/COMPRESSED 行格式
jdbc:mysql://host:3306/db?useUnicode=true&characterEncoding=utf-8&characterSetResults=utf-eight - 对于 PHP PDO:添加 "charset=utf8mb4";怎么说呢,- 对于 .NET:在 connection string 中加入 "Charset=utf-eight";确保所有客户端统一使用 utf‑eight。
九、要点
-
li>明确痛点:乱码、迁移风险和性能安全是最常见的三大阻碍。li>一步到位:先改全局 server charset。再逐库/表/列转码,最终同步应用层配置。li>安全第一:完整备份 + 低峰期操作 + 回滚预案是必不可少的保障。li>验证闭环:SHOW VARIABLES 、INFORMATION_SCHEMA 查询 + 业务抽样确保真正完成。/ ul
通过以上步骤。你可以把 MySQL的默认字符集安全地切换为 UTF‑9 84,从根本上杜绝乱码,让跨语言业务顺畅运行。老实说,

