前段时间贴吧更新了一个昵称规则,好像必须要用一个特殊符号或者表情符号写到昵称里,就像这种小表情:
那些曾经随意起用户名然后发现贴吧无法改名的用户得到了第二次新生。而在我编写一个注册系统时,也将用户名中包含表情符号的功能考虑进去了,结果发现报错Mysql无法存储此字符。在这个坑里我爬了半天,是怎么回事呢?
事实上这是Mysql的一个bug,在Mysql中,如果使用UTF-8
编码来保存字符串(当然,这是很常见的,大家都这么做),那么就需要注意Mysql的“UTF-8”编码并不是广为流传的、约定俗成的UTF-8。
一般我们使用的广为流传的UTF-8是在以1-4(1-6是旧规范,现已被RFC 3629修改为1-4)个字节来表示一个字符的。而Mysql的“UTF-8”是早于RFC 3629设计的,它只支持1-3个字节表示一个字符…所以不仅仅是现在的表情符号,汉字、韩文中某些达到四个字节的偏僻字,也应当无法存入。
后来Mysql官方在2010年,悄悄发布了一个utf8mb4
编码修复了此bug。utf8mb4编码,就是符合RFC 3629规范的Mysql、MariaDB用的UTF-8编码了。所以现在我们在使用Mysql或MariaDB时,应当使用utf8mb4
。但是现在很多生产环境的Mysql库还是用的“UTF-8”啊!坑啊!
Mysql或MariaDB无法保存UTF-8编码的表情符号
最新推荐文章于 2022-03-05 21:31:29 发布