阿里云RDS for MySQL数据库为存储Emoji表情 将编码方式改成utf8mb4

原由

最近在公司的APP项目中出现了,手机移动端输入法输入Emoji表情和火星文等特殊字符时,后台接口存入数据库报错的问题。错误为以下形式html

Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x97\xF0\x9F...' for column 'CONTENT' at row 1

 

分析

  • 网上查了一下问题是移动端的emoji表情为四个字节,而MySQL的utf8编码方式的数据为三个字节。将MySQL的utf8编码改成utf8mb4编码方式就能够进行存储了。
  • 这里须要注意MySQL必须是5.5.3以上版本的,咱们公司使用的是5.6版本因此没有问题能够改。
  • 其实移动端项目一开始就应该把数据库设置成utf8mb4编码方式的,不必都开始运营了才改。无奈以前没有移动端开发的经验犯了这种低级错误。
  • 网上不少修改的方法,可是咱们的项目使用的是阿里云的RDS数据库,我记录一下变动的过程方便一样状况的朋友解决问题。

 

过程

如下过程主要参考了阿里云官方帮助文档《RDS MySQL使用utf8mb4字符集存储emoji表情》java

 

一、查看是否支持utf8mb4

    在数据库client终端查看数据库是否支持utf8mb4编码方式mysql

  1. SHOW CHAR SET WHERE Charset LIKE "%utf8%";

 

二、修改参数

在RDS控制台-参数配置功能中修改character_set_server参数为utf8mb4。spring

修改后须要重启实例方可生效。                  sql

三、在RDS中建立新的数据库

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

 

七、将项目jdbc链接指向新的数据库地址

 

至此本次变动完成,连接客户端测试一切正常。

相关文章
相关标签/搜索