微信公众号开发-emoji表情存库异常

来源:互联网 发布:mac版金蝶友商智慧记 编辑:程序博客网 时间:2024/05/16 13:44

微信公众号开发(坑)-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_nameValuecharacter_set_clientutf8mb4character_set_connectionutf8mb4character_set_databaseutf8mb4character_set_filesystembinarycharacter_set_resultsutf8mb4character_set_serverutf8mb4character_set_systemutf8collation_connectionutf8mb4_unicode_cicollation_databaseutf8mb4_unicode_cicollation_serverutf8mb4_unicode_cicollation_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;"/>


只是我们项目无法改数据源。


1 0