首页 > 学院 > 开发设计 > 正文

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

2019-11-07 23:13:55
字体:
来源:转载
供稿:网友

微信公众号开发(坑)-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	Valuecharacter_set_client	utf8mb4character_set_connection	utf8mb4character_set_database	utf8mb4character_set_filesystem	binarycharacter_set_results	utf8mb4character_set_server	utf8mb4character_set_system	utf8collation_connection	utf8mb4_unicode_cicollation_database	utf8mb4_unicode_cicollation_server	utf8mb4_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;"/>

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表