MySql 存储微信名称(emoji表情)报错:Incorrect string value: \xF0\x9F\x98\x82\xF0\x9F...
时间: 2024-09-03 16:01:55
来源:网络
作者:自由
分类:数据库
简介:
MySql 存储微信名称(emoji表情)报错:Incorrect string value: \xF0\x9F\x98\x82\xF0\x9F...F
一、问题描述
在开发小程序登录模块的时候,通过微信授权后获取到用户的信息,然后实现自动登录,但是系统上线后,有一个用户登录一直提示报错,然后查看了后台日志发现,原来是数据库插入语句报错了:获取的用户姓名不是正常的文字,而是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)
标签:
文章声明
版权声明:本文为作者原创,仅用于本站访客学习、研究和交流目的,未经授权禁止转载
了解
作者
一个90后草根站长!13年入行。一直潜心研究技术,一边工作一边积累经验,分享一些个人后端技术(java、python、c#、php等),以及前端相关等心得。
站长
推荐
友情
链接