手头的一个老项目,用的是 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,否则可能会碰到非英文字符在数据库中看起来正常,但在程序中却出现一串问号的情况。