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

起因

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

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表情》

 

1、查看是否支持utf8mb4

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

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

    112113_P9wi_3452433.png

 

2、修改参数

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

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

132249_7frz_3452433.png

3、在RDS中创建新的数据库

RDS for MySQL数据库并不支持修改编码方式,所以要通过新建数据表,然后导数据的方式进行变更。

114538_yYou_3452433.png

4、老数据库数据迁移到新库

5、改变原数据表的编码方式

原来已经生成的数据表需要修改编码方式

-- 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)来解决此问题。

alter table ex_order_base modify column sn varchar(191);

2)没有varchar类型字段的数据表编码格式不会改,没弄清楚为什么。

 

6、去掉数据库链接参数中的编码方式

去掉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

 

7、将项目jdbc连接指向新的数据库地址

 

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

转载于:https://my.oschina.net/u/3452433/blog/887908

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值