牛叔叔 的笔记

好好学习

2019-03-23 19:15

网站使用微信扫码注册登录,昵称有emoji表情时数据库报错

牛叔叔

JavaEE

(2770)

(1)

收藏

blog

在开发网站登录时选择了使用微信的扫码登录,使用微信开放平台:https://open.weixin.qq.com/


测试没有问题,当上线时,发现部分同学扫码不能登录,报错,查询错误是

Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x9B\xF0\x9F...' for column 'nickName' at row 1


这是由于扫码用户昵称中有emoji表情符号所致。出现原因:当insert数据中有表情时发生。而这些表情是按照4个字节一个单位进行编码的,而我们使用的utf-8编码在mysql数据库中默认是按照3个字节一个单位进行编码的.


两种解决方案,一种是更改数据库编码,支持该编码符号保存,一种是干脆更改java代码逻辑,直接替换掉这些代码。


更改数据库编码:


第一步:修改mysql的配置文件mysql/bin/my.ini, 添加如下内容:


注意:是添加内容

[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
init_connect='SET NAMES utf8mb4'

 第二步:重启数据库


linux输入命令:service mysql restart

windows输入命令:net stop mysql  和 net start mysql

第三步:修改数据表的编码为utf8mb4


在改动的数据库那,执行查询语句:ALTER TABLE TABLE_NAME CONVERT TO CHARACTER SET utf8mb4;

 最后,将数据库连接语句url中去掉characterEncoding;重启项目。



直接替换

source.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", "");


1条评论

点击登录参与评论

  • author
    牛叔叔 2019-03-24 12:06

    后来发现,微信的城市city字段也有这样的符号,干脆一股脑都给替换了。