微信公众号开发(坑)-emoji表情存库异常
年后刚来就开始忙,一直在加班。赶进度,上线,终于有时间回来发发博客:
最近处理的一个微信的坑:
微信网名中:可以使用Emoji表情。但是同样的就带来了一系列的问题:
将用户名存入数据库时候存在异常:
SQL异常如下:
java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x97\xF0\x9F...' for column 'CONTENT' at row 1
那么该如何解决呢?
看了N多别人的博客。准备将数据库改UTF8MB4字符集
原因:
普通的字符串或者表情都是占位3个字节,所以utf8足够用了,但是移动端的表情符号占位是4个字节,普通的utf8就不够用了,只能使用UTF8的超集 utf8mb4 字符集。
于是改了 数据库的字符集并且重启了线上的数据库。 冒着掉脑袋的风险,成功改了字符集,很成功的 大家都收到了监控报警。
一、改Mysql字符集
改全库字符集 并不复杂:
MYSQL 版本一定要高于 5.5.3 如果低 就升级数据库吧 (好在我是5.7)
1、编辑 my.cnf
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
我们采用的是主从架构。 一定要主从都改
2、重启数据库
SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
Variable_name Value
character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database utf8mb4
character_set_filesystem binary
character_set_results utf8mb4
character_set_server utf8mb4
character_set_system utf8
collation_connection utf8mb4_unicode_ci
collation_database utf8mb4_unicode_ci
collation_server utf8mb4_unicode_ci
collation_connection 、collation_database 、collation_server是什么没关系。
很成功,重启服务。发现还是存不进库。
3、改表结构
原来涉及到的表没改。 将相关的表改了字符集为UTF8MB4 或者nikename 字段改UTF8MB4即可。
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
重启服务,发现问题依然存在。再三检查。
4、发现JDBC URL characterEncoding=utf8
这个并没用问题。原来JDBC Driver 版本高于 5.1.13,会自动识别的。
那么问题出现在哪里了?
发现我们的架构中Mysql中间件是 mysql-proxy 心想是不是这里出现了问题。
于是先改了Mysql-proxy的字符集。
重启还是不行。这我就生气了。然后把mysql-proxy直接去了 tomcat直接链接 主库。
发现没问题了。 但是Mysql主从架构必备的。 发现mysql-proxy 代理出来的是 mysql5.1 心想 可能是这里出了问题。
于是 提议改中间件。 改用了MyCat(中间件)
果然好了。。。。
其实不改也行。。使用Druid 数据源 配置一个参数 设置
<property name="connectionInitSqls" value="set names utf8mb4;"/>