MySQL不宜使用utf8字符编码格式,应使用utf8mb4
2020-07-05 网络
一网友开发过程中曾遇到这样一个bug,他试着通过Rails在以"utf8"编码的MariaDB中保存一个UTF-8字符串,然后出现了一个离奇的错误:
Incorrect string value: '\xF0\x9F\x98\x83 <…' for column 'summary' at row
用的是UTF-8编码的客户端,服务器也是UTF-8编码的,数据库也是,就连要保存的这个字符串" <…"也是合法的UTF-8编码格式,但却出了问题,最终发现问题的症结在于,MySQL的"utf8"实际上不是真正的UTF-8。"utf8"只支持每个字符最多三个字节,而真正的UTF-8是每个字符最多四个字节。
MySQL一直没有修复这个bug,他们在2010年发布了一个叫作"utf8mb4"的字符集,绕过了这个问题。
当然,他们并没有对新的字符集广而告之(可能是因为这个bug让他们觉得很尴尬),以致于现在网络上仍然在建议开发者使用"utf8",但这些建议都是错误的。
简单概括如下:
MySQL的"utf8"是一种"专属的编码",它能够编码的Unicode字符并不多。
MySQL的"utf8mb4"是真正的"UTF-8"。
此时得澄清一下:所有在使用"utf8"的MySQL和MariaDB用户都应该改用"utf8mb4",尽量不使用"utf8"。
目前移动端设备及高级输入法都可输入表情符,最典型的就是微信昵称。这种字符不在utf8 字符集范围内,将会导致utf8 字符集的数据库插入操作时报错。
使用sql语句查询当前数据库编码:
show variables like "%char%";
执行命令后看到的内容如下:
mysql> show variables like "%char%"; +--------------------------+-----------------------------------------------+ | Variable_name | Value | +--------------------------+-----------------------------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | D:\phpStudy\PHPTutorial\MySQL\share\charsets\ | +--------------------------+-----------------------------------------------+ 8 rows in set (0.00 sec)
关于MySQL修改字符编码格式请浏览:MySQL修改字符编码格式为utf8mb4