如何修改数据库默认字符集为UTF-8?

更新于
2026-08-15 03:41:25
6阅读来源:SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

一、什么是数据库默认字符集?

常见的默认字符集有:

  • MySQL这方面,latin1utf8mb4
  • SQL Server:SQL_Latin1_General_CP1_CI_AS
  • PostgreSQL:UTF8
  • 再看Oracle。AL32UTF8
  • MongoDB:UTF8

至于使用者痛点,

  • 乱码问题:跨语言、跨网站的数据在读取时出现“?,?,”或乱码。
  • 迁移失败:从旧程序迁移数据后部分文字丢失或显示错误。
  • 性能疑虑:担心改为 UTF‑8 会导致存储空间膨胀或查询变慢。
  • 兼容性风险:应用层连接字符串、ORM 配置未同步导致异常。

二、为什么要把默认字符集改为 UTF‑8?

全语言支持:UTF‑8 能完整表示 Unicode,涵盖中文、日文、韩文、表情符等所有字符。

如何修改数据库默认字符集为UTF-8?

避免数据损失:使用单字节 latin1 时非 Latin 字符会被截断或转换成问号。

统一标准:大多数现代框架和第三方服务默认采用 UTF‑8,保持一致可减少调试成本。

三、修改前的准备工作

  1. 备份全库数据:
    MYSQlDump -u root -p --all-databases> all_backup.sql
    
  2. 确认业务低峰期:
  3. 检查现有字符集冲突:
  4. 准备好回滚方案:

四、修改全局字符集设置

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) 单库改名方式——先导出再导入

  1.  mydb.sql
    
  2. Edit SQL 文件。将所有 `CREATE DATABASE` 和 `CREATE TABLE` 的 charset/collation 替换为 'utf8mb4'/'utf8mb4_unicode_ci'.
  3. Create 新库并导入:
  4. If you cannot afford downtime,see “在线转换”章节。

b) 在线转换单库

先修改数据库默认字符集:

遍历所有表并逐一转换:

将上述查询结果复制为批量执行的 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 自动化处理

② 导入旧备份后出现“Incorrect string value”错误 - 确保 backup 文件本身已是 UTF‑8 编码 - 在导入前加上参数

mysql --default-character-set=utf8mb4 -u root -p dbname 

③ 索引长度超限 - 对于 InnoDB,需要把索引长度限制在 191 字符以内 - 示例:

CREATE INDEX idxname ON tab);或者把 innodblarge_prefix=ON 并使用 DYNAMIC/COMPRESSED 行格式

④ 性能下降感知明显 - 检查是否因为索引前缀被截短导致全表扫描 - 调整查询语句或重新创建合适长度的索引 - 使用 pt‑online‑schema‑change 等工具平滑重建索引

⑤ 应用层仍使用旧连接字符集 - 更新 JD娱乐 URL,例如:

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。

⑥ 数据迁移过程中出现“Data truncated for column …话说回来,” - 检查源字段长度是否足够容纳多字节 UTF‑UTF;必要时扩大 VARCHAR 长度 - 先将目标字段改成 TEXT 再逐步收敛到所需大小,以免一次性报错 }

如何修改数据库默认字符集为UTF-8?

⑦ MySQL 5.6 以下版本不支持 utf​​unicode​ci 排序规则  <\/ td> 升级到 MySQL 5.7+ 或者改用 utf​​general​ci;但注意该规则对某些语言排序不完全相同。<\/ td> <\/ tr> <\/ tbody> <\/ table>

九、要点 

    li>明确痛点:乱码、迁移风险和性能安全是最常见的三大阻碍。li>一步到位:先改全局 server charset。再逐库/表/列转码,最终同步应用层配置。li>安全第一:完整备份 + 低峰期操作 + 回滚预案是必不可少的保障。li>验证闭环:SHOW VARIABLES 、INFORMATION_SCHEMA 查询 + 业务抽样确保真正完成。/ ul

通过以上步骤。你可以把 MySQL的默认字符集安全地切换为 UTF‑9 84,从根本上杜绝乱码,让跨语言业务顺畅运行。老实说,

标签:数据库

一、什么是数据库默认字符集?

常见的默认字符集有:

  • MySQL这方面,latin1utf8mb4
  • SQL Server:SQL_Latin1_General_CP1_CI_AS
  • PostgreSQL:UTF8
  • 再看Oracle。AL32UTF8
  • MongoDB:UTF8

至于使用者痛点,

  • 乱码问题:跨语言、跨网站的数据在读取时出现“?,?,”或乱码。
  • 迁移失败:从旧程序迁移数据后部分文字丢失或显示错误。
  • 性能疑虑:担心改为 UTF‑8 会导致存储空间膨胀或查询变慢。
  • 兼容性风险:应用层连接字符串、ORM 配置未同步导致异常。

二、为什么要把默认字符集改为 UTF‑8?

全语言支持:UTF‑8 能完整表示 Unicode,涵盖中文、日文、韩文、表情符等所有字符。

如何修改数据库默认字符集为UTF-8?

避免数据损失:使用单字节 latin1 时非 Latin 字符会被截断或转换成问号。

统一标准:大多数现代框架和第三方服务默认采用 UTF‑8,保持一致可减少调试成本。

三、修改前的准备工作

  1. 备份全库数据:
    MYSQlDump -u root -p --all-databases> all_backup.sql
    
  2. 确认业务低峰期:
  3. 检查现有字符集冲突:
  4. 准备好回滚方案:

四、修改全局字符集设置

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) 单库改名方式——先导出再导入

  1.  mydb.sql
    
  2. Edit SQL 文件。将所有 `CREATE DATABASE` 和 `CREATE TABLE` 的 charset/collation 替换为 'utf8mb4'/'utf8mb4_unicode_ci'.
  3. Create 新库并导入:
  4. If you cannot afford downtime,see “在线转换”章节。

b) 在线转换单库

先修改数据库默认字符集:

遍历所有表并逐一转换:

将上述查询结果复制为批量执行的 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 自动化处理

② 导入旧备份后出现“Incorrect string value”错误 - 确保 backup 文件本身已是 UTF‑8 编码 - 在导入前加上参数

mysql --default-character-set=utf8mb4 -u root -p dbname 

③ 索引长度超限 - 对于 InnoDB,需要把索引长度限制在 191 字符以内 - 示例:

CREATE INDEX idxname ON tab);或者把 innodblarge_prefix=ON 并使用 DYNAMIC/COMPRESSED 行格式

④ 性能下降感知明显 - 检查是否因为索引前缀被截短导致全表扫描 - 调整查询语句或重新创建合适长度的索引 - 使用 pt‑online‑schema‑change 等工具平滑重建索引

⑤ 应用层仍使用旧连接字符集 - 更新 JD娱乐 URL,例如:

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。

⑥ 数据迁移过程中出现“Data truncated for column …话说回来,” - 检查源字段长度是否足够容纳多字节 UTF‑UTF;必要时扩大 VARCHAR 长度 - 先将目标字段改成 TEXT 再逐步收敛到所需大小,以免一次性报错 }

如何修改数据库默认字符集为UTF-8?

⑦ MySQL 5.6 以下版本不支持 utf​​unicode​ci 排序规则  <\/ td> 升级到 MySQL 5.7+ 或者改用 utf​​general​ci;但注意该规则对某些语言排序不完全相同。<\/ td> <\/ tr> <\/ tbody> <\/ table>

九、要点 

    li>明确痛点:乱码、迁移风险和性能安全是最常见的三大阻碍。li>一步到位:先改全局 server charset。再逐库/表/列转码,最终同步应用层配置。li>安全第一:完整备份 + 低峰期操作 + 回滚预案是必不可少的保障。li>验证闭环:SHOW VARIABLES 、INFORMATION_SCHEMA 查询 + 业务抽样确保真正完成。/ ul

通过以上步骤。你可以把 MySQL的默认字符集安全地切换为 UTF‑9 84,从根本上杜绝乱码,让跨语言业务顺畅运行。老实说,

标签:数据库