MySql 存储微信名称(emoji表情)报错:Incorrect string value: '\xF0\x9F\x98\x82\xF0\x9F...'

在开发小程序登录模块的时候,通过微信授权后获取到用户的信息,然后实现自动登录,但是系统上线后,有一个用户登录一直提示报错,然后查看了后台日志发现,原来是数据库插入语句报错了:获取的用户姓名不是正常的文字,而是emoji表情符号。

jesen
1
2022-08-01 21:11:32
文档目录
我的书签
 

MySql 存储微信名称(emoji表情)报错:Incorrect string value: \xF0\x9F\x98\x82\xF0\x9F...

一、问题描述

在开发小程序登录模块的时候,通过微信授权后获取到用户的信息,然后实现自动登录,但是系统上线后,有一个用户登录一直提示报错,然后查看了后台日志发现,原来是数据库插入语句报错了:获取的用户姓名不是正常的文字,而是emoji表情符号。

二、问题分析

通过上面出现的问题,根据各种资料查询到可能是由于当前MySql数据库的数编码的问题,因为普通的字符串或者符号表情都是占用3个字节的存储空间,所以使用utf8编码就足够用了,但是现在流行的手机端的表情符号(emoji 表情)确是占用4个字节的存储空间,这时普通的utf8就不够用了,需要使用 utf8mb4 字符集来存储。
utf8 是 Mysql 中的一种字符集,只支持最长三个字节的 UTF-8字符,也就是 Unicode 中的基本多文本平面,如果有utf8三个字节存储不下,那么就会存储不进数据库,5.5.3 版本以后才出现了utf8mb4来表示4个字节的字符。为了获取更好的兼容性,应该总是使用 utf8mb4 而非 utf8。 对于 CHAR 类型数据,utf8mb4 会多消耗一些空间,根据 Mysql 官方建议,使用 VARCHAR 替代 CHAR。
MySQL在 5.5.3 之后增加了 utf8mb4 字符编码,mb4即 most bytes 4。简单说 utf8mb4 是 utf8 的超集并完全兼容utf8,能够用四个字节存储更多的字符。

三、解决方式

1.修改mysql的配置文件(windows环境名为:my.ini,linux环境名为:my.cnf)),修改的如下:
[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
2.将数据库中对应的字段的字符集(字符编码类型),改为:utf8mb4
3.修改项目中的连接数据库的url,如果存在编码声明,则将原来的utf-8去掉,改为:utf8mb4

四、知识拓展

  • varchar(255) 所表示的单位是字符,而一个汉字一个字母都是一字符。所以这里可以存储255个汉字或者255个字母
  • utf-8下,1字符=3字节(uft-8也称之为utf-8mb3)
  • utf8mb4下,1字符=4字节
  • varchar的存储上限是65535字节
    • utf-8格式的存储上限是:65535/3 等于 varchar(21845)
    • utf8mb4格式的存储上限是:65535/4 等于 varchar(16383) 
友情提示