emoji是啥?
下面是摘自维基百科的一段解释:
绘文字(英语:emoji,日语:絵文字/えもじ emoji)是使用在网页和聊天中的形意符号,最初是日本在无线通信中所使用的视觉情感符号(图画文字)。绘意指图形,文字则是图形的隐喻,可用来代表多种表情,如笑脸表示笑、蛋糕表示食物等。在中国大陆,绘文字通常叫做“小黄脸”,或者叫emoji。
太抽象?其实emoji就是我们使用了多年的QQ、微信里的表情符号。
emoji表情符号
emoji引发的问题
emoji给我们带来了传图达意的便捷,但是却令开发者很头疼,插入数据库报错:Incorrect string value: \\xF0\\x9F\\x98\\x84\\xF0\\x9F
项目中有一部分要与微信打交道,需要获取扫码用户的昵称信息,而有些用户昵称里含有表情符号,当插入mysql数据库时,就报出了Incorrect string value的错误。
错误原因
mysql数据库默认采用了utf8字符集,utf8字符集最多支持三个字节,而emoji占用4个字节的存储空间,所以在存入数据库时,就引发了错误。
自从mysql 5.5.3版本后,有了一种每个字符使用4个字节的字符集utf8mb4,utf8mb4是utf8的一个超集,兼容utf8,所以将字符集由utf8转为utf8mb4即可解决这个问题。
解决方案
1. 修改mysql配置文件my.cnf(windows server的话,修改my.ini),增加以下设置
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
2. 按需修改数据库、表、字段的字符集
-- 修改数据库字符集
ALTER DATABASE databaseName CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin;
-- 修改表字符集
ALTER TABLE tableName CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
-- 修改列字符集
ALTER TABLE tableName CHANGE columnName VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
3. 改动后重启mysql数据库即可
注意:
如果你使用的是云数据库,那么会有稍许区别,以腾讯云为例:找到MySQL数据库,在实例列表,参数设置部分,找到character_set_server参数,默认是latin1,点击修改,将其改动为utf8mb4,改动完保存后,会自动重启mysql数据库以使修改生效。重启完成后,通过客户端连接,改动相应的表或者数据库字段为utf8mb4即可。
腾讯云mysql
总结
由于mysql 5.5.3版本才增加了utf8mb4字符集,如果低于该版本,需要先进行升级,并评估是否影响已有生产环境。
在项目之初选择mysql服务器时,应根据项目需要提前规划mysql的版本以及字符集,如果有需要,提前将其设置为utfmb4字符集。
云服务器将这些参数全部界面化了,如果通过命令行改动不了(没有权限等错误),就考虑到应该在界面上进行操作,而不要一个劲的去排查为啥没有权限。
閱讀更多 京京肚肚擼代碼 的文章