最近做了一次数据迁移,将传统机房的MySQL转到阿里云;
一方面是基于数据安全性和维护成本考虑;另外一方面确实要也对原有的数据库进行功能升级;
老的数据库版本是5.1.x,只支持utf-8格式的编码;对于目前流行的emoji表情是无法存储的;因为utf-8一个字符最多存储3个字节;而目前大部分emoji表情是4字节的;
那么问题来了,怎么解决这个问题呢? 新版的数据引入了utf8mb4格式编码,这个编码的子集是包含了utf-8的,所以在切换数据库编码、数据表编码、字段编码操作的时候
无需考虑是否不兼容,是否会乱码,大胆地切就行了;
具体错误提示如下:
java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x81' for column xxx
uncategorized SQLException for SQL []; SQL state [HY000]; error code [1366]; Incorrect string value: '\xF0\x9F\x98\x81'
在购买阿里云RDS主机时,一定要选择5.6以上的版本;5.6以上的版本才支持utf8mb4刚才已经提到了;
由于是做数据迁移,我这边是要将一个原本utf-8格式的库迁移到阿里云上去,具体操作如下:
1、建立一个新的数据库、编码设置为utf8mb4
2、创建数转移任务,将老库的数据转移到新库中,注意迁移时将目标库编辑成刚才我们创建的那个数据库名称,这个操作相当于将老库的全部表迁移到新库中;
3、接下来完成迁移后,修改配置文件:
注意:修改这个参数要重启实例,重启过程可能造成服务闪断,这个是没办法的;
更多配置可以参考阿里云官方文档:
https://selfservice.console.aliyun.com/ticket/scene?productCode=rds&productName=%E4%BA%91%E6%95%B0%E6%8D%AE%E5%BA%93%2BRDS%E7%89%88
这些配置完成以后,意味着你的数据库已经支持utf8mb4了,也就是可以插入emoji表情了;但是以下几步也非常重要,否则也无法使用utf8mb4编码:
1、将需要支持utf8mb4的数据表设置为:utf8mb4编码格式:
语法为:ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
例如:LTER TABLE `my_table` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2、将需要支持的数据表字段,注意是字段也要设置为utf8mb4编码格式:
语法为:ALTER TABLE 表名 CHANGE 字段名 字段名 类型 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
例如:ALTER TABLE my_user CHANGE content content TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
应用层需要注意的:
1、JDBC的版本必须大于5.1.13版本;
2、大部分问题都在MySQL这边,应用层问题较少;什么数据库连接字符串、连接池、Spring、mybatis什么的,根本不用做改动!
到这里,整个操作就完成了;enjoy!