阿里云RDS for MySQL使用utf8mb4编码存储Emoji表情

问题描述

公司的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版本所以没有问题可以改。

解决过程

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

1、查看数据库是否支持utf8mb4

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

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

在这里插入图片描述

2、修改参数

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

修改后需要重启实例方可生效。
在这里插入图片描述

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

RDS for MySQL数据库并不支持修改编码方式,所以要通过新建数据表,然后导数据的方式进行变更。
在这里插入图片描述

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字节),那么2553=765可以建立为索引。现在如果改成utf8mb4编码(4字节),那么2554=1020显然超过767个字节的规定。可以将建立索引的字段字符数改少(191正好764)来解决此问题。
alter table ex_order_base modify column sn varchar(191);
  1. 没有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连接指向新的数据库地址


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值