首页 / 技术分享 / 数据库 /
MySQL 批量修改字符集

MySQL 批量修改字符集

码不停提

2026-01-21
34 次浏览
0 条评论

有时候数据库可能因为备份或数据迁移导致数据字符集混乱;这里提供一个技巧,通过一个 SQL 对每个表生成一个字符集修改的 SQL;然后通过执行对应的 SQL 去修改表的字符集。

数据库
MySQL
字符集
utf8mb4
分享:

先执行下面的 SQL,然后导出生成的 SQL 语句到text 文件;

再从 txt 文件中复制 SQL 到数据库,再执行一遍;

SELECT
   CONCAT( 'ALTER TABLE ',TABLE_NAME,' CONVERT TO CHARACTER SET utf8mb4 collate utf8mb4_general_ci;') 
FROM
    information_schema.`TABLES`
WHERE
    TABLE_SCHEMA = DATABASE() ORDER BY TABLE_NAME;

这个 SQL 是把数据库所有表的字符编码及字符集改为 utf8mb4 - utf8mb4_general_ci;

可根据需求,调整这两个参数;


1. MySQL 常用字符集简介

  • 字符集(Character Set) 指定了数据库字符串字段可以存储哪些字符。例如 utf8utf8mb4
  • 排序规则(Collation) 决定了字符串如何比较和排序。常见的后缀有 _general_ci_unicode_ci_bin,等。

2. 排序规则对比

2.1 _general_ci_unicode_ci

  • general_ci(通用,区分大小写 Insensitive)

    • 语义:大致按照拉丁字母规则简化比较和排序,忽略大小写(ci = case-insensitive)。
    • 适用场景:不需要严格符合 Unicode 规范的通用排序。效率较高,适合大多数英文、简单多语言场景。
    • 局限性:对部分 Unicode 字符处理不精确(如某些变音符不能完全等价等)。
  • unicode_ci(Unicode,区分大小写 Insensitive)

    • 语义:基于 Unicode 标准实现的比较,更精确地支持各种语言字符,忽略大小写。
    • 适用场景:涉及多语种、复杂语义、精细国际化需求时推荐使用。
    • 局限性:相较 general_ci,效率略低,但更准确。

举例

  • utf8_general_ci(效率高,但不完全准确)
  • utf8_unicode_ci(准确遵循 Unicode,推荐需要国际化支持时用)

2.2 _bin

  • bin(Binary,二进制比对)
    • 语义:完全基于字符的二进制值进行比较和排序,区分大小写和字符编码的所有细节。
    • 适用场景:需要精准区分字符差异、存储密钥、做唯一性约束或对大小写敏感的场合。
    • 注意事项:排序、人类语义性较差,比如 'a' 和 'A' 视为不同字符。

3. 字符集对比

3.1 utf8 vs utf8mb4

  • utf8

    • 最多支持 3 字节编码。不能存储 4 字节 Unicode 字符(如 Emoji、部分生僻汉字)。
    • 适用场景:不涉及 Emoji 或 4 字节字符时可用。
    • 已被标注为“不完全的 UTF-8 实现”,新版 MySQL 官方建议避免新应用选择它
  • utf8mb4

    • 真正的 UTF-8 实现,支持 1~4 字节所有 Unicode 字符
    • 能存储 Emoji、高Unicode码点汉字等字符。
    • 适用场景:推荐所有新项目或需要兼容 Emoji、多语言内容时使用。

4. 推荐使用场景

应用需求 字符集/排序规则 说明
仅英文、简单多语言 utf8_general_ci 性能高,适用简单场景。
国际化(需严格多语种支持) utf8_unicode_ci 精确、强大,推荐多语种要支持的场合。
需要 Emoji、所有 Unicode utf8mb4_unicode_ci 推荐现代应用的默认选择,完全支持最新字符内容。
对大小写、字节码严格辨别 utf8mb4_bin 密钥、token、对比严格场合使用。
新项目强烈建议 utf8mb4_unicode_ci 官方推荐,兼容所有需求。

5. 总结建议

  • 新建表/数据库尽量指定 utf8mb4 设置,并选用合适的 Collation(如 utf8mb4_unicode_ci 或 utf8mb4_bin)。
  • 遇到 Emoji 存储问题,多半是使用了 utf8 而非 utf8mb4。
  • 需要高效简单查询可用 general_ci,语言复杂建议选 unicode_ci。
  • 需要严格比对的(如密码、唯一键)可用 bin 排序规则。

6. 示例

-- 推荐设置:
CREATE DATABASE dbname DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

参考文档

评论区 (0)

你需要先 登录 后才能发表评论。
还没有人评论,赶快成为第一个吧。