一个关于MySQL指定编码实现的小坑

写在前面

环境:MySQL5.7+,MySQL数据库字符编码实现为utf8,表也为utf8

场景:微信授权获取用户信息(包括昵称)并保存到数据库,有的用户成功了,少数用户却失败了

 

那么为什么会失败呢? 

贴上报错日志

Incorrect string value: '\xF0\x9F\x98\x98\xF0\x9F...' for column 'nickname' at row 1

是因为失败的用户微信昵称中带有emoji符号导致的

 

剖析:

MySQL支持多种字符编码集,如UTF-8、GB2312、GBK等

可以通过 SHOW CHARSET 命令查看。

通常我们会建议使用 UTF-8 作为默认的字符编码方式。

从上图我们可以看到,MySQL数据库有两套 UTF-8 编码实现。

 

  • utf8:utf8 编码只支持三个字节以内。在 utf8 编码中,中文是占了3个字节,其他的英文、数字、符号都是占1个字节。但是emoji符号占4个字节,一些比较复杂的文字、繁体字也是占4个字节。

 

  • utf8mb4:UTF-8编码的完整实现。最多可支持4个字节,所以,可以用来存储emoji符号。

 

查阅资料,官方解释:

2021/10/03更新

按照网上的教程或者个人习惯数据库安装完之后

my.ini(Windows)或my.cnf(linux)文件的两处都会是以下这样的

[mysql]

default-character-set=utf8

[mysqld]

character_set_server=utf8

 

那怎么解决呢?

方式一

找到这两处进行修改

[mysql]

default-character-set=utf8mb4

[mysqld]

character_set_server=utf8mb4

再重启数据库

 

方式二

1、SpringBoot项目

修改配置文件

application.yml

在spring.datasource后面再加上这一段

  druid:
   connection-init-sqls:
    set names utf8mb4

2、SSM项目

修改配置文件

applicationContext.xml

 

关键代码 

<property name="connectionInitSqls" value="set names utf8mb4;"/>

 

这样才算完美解决

最后

Tips:如果有需要保存emoji符号的字段,记得一定要指定编码为 utf8mb4 。 

 

posted @ 2021-11-03 21:19  Jae1995  阅读(139)  评论(0编辑  收藏  举报