序
今天在写完一篇带 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 带来的乐趣吧!
图
小樽運河とホルンちゃん pic.twitter.com/hS7pEKawyM — ののこ@こみトレ4号館コ18a (@korokoroudon) December 17, 2019