最近在公司的APP项目中出现了,手机移动端输入法输入Emoji表情和火星文等特殊字符时,后台接口存入数据库报错的问题。错误为以下形式html
Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x97\xF0\x9F...' for column 'CONTENT' at row 1
如下过程主要参考了阿里云官方帮助文档《RDS MySQL使用utf8mb4字符集存储emoji表情》java
在数据库client终端查看数据库是否支持utf8mb4编码方式mysql
SHOW CHAR SET WHERE Charset LIKE "%utf8%";
在RDS控制台-参数配置功能中修改character_set_server参数为utf8mb4。spring
修改后须要重启实例方可生效。 sql
RDS for MySQL数据库并不支持修改编码方式,因此要经过新建数据表,而后导数据的方式进行变动。数据库
原来已经生成的数据表须要修改编码方式测试
-- ex_company 为要修改的表名 ALTER TABLE ex_company CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
*修改编码方式的过程当中出现了两个问题阿里云
1)现了一个错误“utf8mb4 Specified key was too long; max key length is 767 bytes”编码
此错误的问题在于MySQL数据库创建索引的字段不能超过767个字节,若是创建索引的字段原来是utf8编码(3字节),那么255*3=765能够创建为索引。如今若是改为utf8mb4编码(4字节),那么255*4=1020显然超过767个字节的规定。能够将创建索引的字段字符数改少(191正好764)来解决此问题。url
alter table ex_order_base modify column sn varchar(191);
2)没有varchar类型字段的数据表编码格式不会改,没弄清楚为何。
去掉jdbc连接参数中的“useUnicode=true”和“characterEncoding=UTF-8”参数
修改前:
spring.datasource.url=jdbc:mysql://rdso30006c33s57oufvfo.mysql.rds.aliyuncs.com:3306/pltx-test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
修改后:
spring.datasource.url=jdbc:mysql://rdso30006c33s57oufvfo.mysql.rds.aliyuncs.com:3306/pltx-test?zeroDateTimeBehavior=convertToNull
至此本次变动完成,连接客户端测试一切正常。