今天在写完一篇带 emoji 文章点击保存后,网页 database query error 把我吓得一个激灵,赶紧后退,幸好文章还在,赶紧复制备份了先。
刚开始以为是 Typecho 对 8.0 mysql 数据库的兼容问题,于是尝试直接登入 PhpMyadmin 修改 sql ,然而还是报错,但是 phpMyadmin 提供了一个新的信息,general error 1366 incorrect string ,于是尝试搜索同样遇到此问题的小伙伴。

根本问题在于 Mysql 的历史遗留问题。来自译 | 永远不要在MySQL中使用utf8,改用utf8mb4 大致内容就是 Typecho 默认用的是 utf8 编码,并不是现在广为使用的utf8mb4 ,后者支持4个字节,前者只有三个,而 emoji 是四个字节的字符,自然会发生非法字符串的错误。但是 emoji 就是正义,不能向困难屈服!

首先登入 phpmyadmin ,在对应的数据库->操作中最底部找到排序规则,更改为utf8mb4

utf8_unicode_ci 比较准确,utf8_general_ci 速度比较快。通常情况下 utf8_general_ci 的准确性就够我们用的了,在我看过很多程序源码后,发现它们大多数也用的是 utf8_general_ci,所以新建数据库时一般选用utf8_general_ci 就可以了,如果是 utf8mb4 那么对应的就是 utf8mb4_general_ci utf8mb4_unicode_ci

编辑 typecho 目录下的 config.inc.php ,用 vim 编辑,找到 'charset' => 'utf8', 更改为 'charset' => 'utf8mb4', 然后:wq 保存即可,享受 emoji 带来的乐趣吧!

Twitter