zzxworld

utf8 to utf8mb4 - 直接修改 MySQL 数据库字符集

手头的一个老项目,用的是 MySQL 的 utf8 字符集。碰到要保存特殊字符的场景(比如 Emoji),就会报「Incorrect string value: '\xX0\xXD...‘」这种错误。这个问题有两种解决方案:要么在保存之前把这些特殊字符清理掉,要么把数据库的字符集升级为 utf8mb4。

我选择了后者,因为清理特殊字符需要动待保存的内容,这破坏了原数据的完整性。其次,对这个项目来说,还在使用 utf8 字符集本身就是遗留下来的技术债,也该还了。

由于 utf8mb4 兼容 utf8,所以升级过程并不复杂。理论上来说,不用像 gbk 到 utf8 那样还要建新库,然后把数据从旧库迁移到新库这么麻烦。不过保险起见,备份的步骤还是要有。

做好准备工作和心理建设后,以下是具体的操作步骤:

一、登录到 MySQL 的控制台。

二、查看当前数据库是否支持 utf8mb4 字符集:

SHOW CHARACTER SET LIKE 'utf8mb4';

有以下输出内容可以继续:

mysql> SHOW CHARACTER SET LIKE 'utf8mb4';
+---------+---------------+--------------------+--------+
| Charset | Description   | Default collation  | Maxlen |
+---------+---------------+--------------------+--------+
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci |      4 |
+---------+---------------+--------------------+--------+

没有上面的输出就有点麻烦了,需要配置或重新安装更高版本的 MySQL 服务器,以支持 utf8mb4。

三、选择要修改的数据库,调整数据库的字符集:

ALTER DATABASE `DB_NAME` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

DB_NAME 是要调整的数据库名,使用时根据自己的实际情况修改。

这样就完成了数据库的字符集调整,之后建新表默认都会是 utf8mb4。

四、调整指定的数据表:

ALTER TABLE `TABLE_NAME` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

TABLE_NAME 是要调整的数据库表名称,使用时根据自己的实际情况修改。

以上语句会把数据表和表中的需要用到字符集的字段都转换为 utf8mb4。

完成数据库层面的调整后,还需要在程序中把 MySQL 数据库连接配置中的字符集也改为 utf8mb4,否则可能会碰到非英文字符在数据库中看起来正常,但在程序中却出现一串问号的情况。

2 条评论

  1. wu先生
    我也刚将博客程序的数据库更新了一下。😘
    • zzxworld
      还真是不谋而合 🤝