欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-28 22:35:21
节省大家时间先上解决方案!解决方案:将Mysql的编码从utf8转换成utf8mb41.修改mysql配置文件(windows:my.ini;linux:my.cnf)重启mysql实例[mysqld]#character-set-server=utf8 这行注释掉character-set-client-handshake = FALSEcharacter-set-server = utf8mb4collation-server = utf8mb4_general_ciinit_c...

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

解决方案:将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的配置的编码格式。

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

测试的结果~正确写入

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

最后想说一下:

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

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

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

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