MySql支持Emoji表情(原创非转载)

2022-08-01,,,,

节省大家时间先上解决方案!

解决方案:将Mysql的编码从utf8转换成utf8mb4

1.修改mysql配置文件(windows:my.ini;linux:my.cnf)重启mysql实例

[mysqld]
#character-set-server=utf8 这行注释掉
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect = 'SET NAMES utf8mb4'

顺便提一下阿里云的rds也是可以配置的~,但是能不能重启就得看你们评估了~

2.修改您要使用的库、表、字段的编码为utf8mb4

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE     utf8mb4_general_ci;

以下解决过程以及问题分析。没时间可以忽略。

~~~~~~~~~****~**~~~~~~~~~~~~~~~**~*~*~*~~*~*分割线~**~*~*~*~*~*~*~*~*~~~*~~~~~~~~~*~*~*~*~

知其然,知其所以然~

程序报错:

java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x9D' for column 'user_name' at row 1

### Error updating database.  Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x9D' for column 'user_name' at row 1
### The error may involve hillinsight.scrm.organization.mappers.user.ScrmUserInfoMapper.updateByUserId-Inline
### The error occurred while setting parameters
### SQL: UPDATE t_scrm_user_info SET user_name = '<U+1F61D>',user_sex = '1',user_birthday = '1997-10-14',city = '',province = '',area = '',first_raises_pet = '2018-01-01',user_avatar = '0' WHERE (user_id = '0edd783d
d1bb48c2a2b3e00fabd15f8d')
### Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x9D' for column 'user_name' at row 1
; uncategorized SQLException for SQL []; SQL state [HY000]; error code [1366]; Incorrect string value: '\xF0\x9F\x98\x9D' for column 'user_name' at row 1; nested exception is java.sql.SQLException: Incorrect string 
value: '\xF0\x9F\x98\x9D' for column 'user_name' at row 1
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:90)
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:82)
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:82)
        at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:75)
        at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:447)
        at com.sun.proxy.$Proxy162.update(Unknown Source)
        at org.mybatis.spring.SqlSessionTemplate.update(SqlSessionTemplate.java:295)
        at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:59)
        at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53)

主要原因UTF-8编码有可能是两个、三个、四个字节。Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去。

提醒一下:有些文章(大多是转载的同一作者)指出需要修改jdbc的mysql连接url,去掉其中的characterEncoding=utf8

jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=true

这个配置是干什么的,大家解决乱码问题的时候肯定用到了。

主要作用如下。

1. 存数据时:

     数据库在存放项目数据的时候会先用UTF-8格式将数据解码成字节码,然后再将解码后的字节码重新使用GBK编码存放到数据库中。

2.取数据时:

     在从数据库中取数据的时候,数据库会先将数据库中的数据按GBK格式解码成字节码,然后再将解码后的字节码重新按UTF-8格式编码数据,最后再将数据返回给客户端。

这是我搬过来的解释。这里面其实我标注的红色部分是有问题的,这里并不是GBK编码,取决于mysql的配置的编码格式。

所以说这个参数不能去掉,因为它的作用在于存取数据时的格式,而并不是数据库存储的格式。

测试的结果~正确写入

最后想说一下:

有些同行只会转载一些文章,而不去确保文章内容的可行性。

虽然说我们不生产代码,我们只是代码的搬运工。但是我们也要以严谨的态度来对待技术。搬运的时候还是希望能弄明白作者以及读者的意图。不要盲目搬运给读者误导。

以上纯属个人见解,如有问题,欢迎大家指正讨论。

本文地址:https://blog.csdn.net/zhaohuanvip/article/details/107409981

《MySql支持Emoji表情(原创非转载).doc》

下载本文的Word格式文档,以方便收藏与打印。