这里定期分享科技、信息技术、商业、医学及人文资讯,每周日发布。欢迎投稿或推荐线索。
封面主题:春节
下周是春节假期。2021是辛丑牛年,鉴于拼过2020,不免俗气一点,预祝大家“牛转乾坤”牪犇𤛭。
本期新年主题本来写得很长,人物也是大名鼎鼎的史蒂芬·霍金。由于最后添加了上面一行文字,并且在句末包含了“牪犇𤛭”三个字祝大家很多牛,结果:𤛭后面的内容完全没有被存储。
这是一次数据库编码事故,源于MySQL数据库和数据连接都默认使用了“utf8”字符集,它不是真正支持四字节的UTF-8,造成数据丢失。
在MySQL里实现的utf8最长使用3个字节,也就是只支持到了 Unicode 中的基本多文本平面(U+0000至U+FFFF),包含了控制符、拉丁文,中、日、韩等绝大多数国际字符,但并不是所有,最常见的就算现在手机端常用的表情字符emoji和很多不常用的汉字,如 “𤛭” ,这些需要四个字节才能编码出来。
也就是说,MySQL的utf8不是真正的UTF-8,而是一个专有字符编码,然后用一个新的utf8mb4来表示UTF-8。“永远不要在MySQL中使用utf8,始终使用utf8mb4代替”(In MySQL, never use “utf8”. Use “utf8mb4”),软件工程师Adam Hooper说。
因此现已将数据库/表编码切换到utf8mb4_general_ci(也可以是更标准的utf8mb4_unicode_ci,主要区别在于前者速度快,后者排序精确),并将数据连接修改为utf8mb4,上述故障解除。
当我们把一个需要4字节UTF-8编码才能表示的字符存入utf8数据库的时候就会报错:ERROR 1366: Incorrect string value: '\xF0\x9D\x8C\x86' for column
。此时需要升级MySQL到5.6或更高版本,并且将表字符集切换至utf8mb4。
由于没有底稿,没有备份,不准备补写了。祝大家快乐,下期继续。