问题:
微信的昵称可以含有emoji表情,把这样的昵称存储到数据库时出现了这个异常:
java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x95 ...' for column 'nickName' at row 1
分析:
简单的说,就是utf-8字符集不够用了,emoji超过了utf-8的范围
解决方案:
就是要使用新的字符集utf8mb4(Mysql 5.5.3之后的版本才支持utf8mb4),
有两种方案
1.(网上找的,没试过,不知道有没有用)
修改mysql的配置文件,windows下的为my.ini(linux下的为my.cnf),改成下面这样
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
将数据库中对应的字段改为
字符集:utf8mb4
排序规则:utf8mb4_general_ci
修改项目中的连接数据库的url,将characterEncoding=utf-8去掉
2.(适用于使用阿里巴巴druid连接池的,亲测有效)
同样需要将数据库中对应的字段改为
字符集:utf8mb4
排序规则:utf8mb4_general_ci
项目中的连接数据库的url保留characterEncoding=utf-8
spring配置文件spring-common.xml(文件名可能不同)连接池配置增加一行
<bean id="masterDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="connectionInitSqls" value="set names utf8mb4;"/>
...
</bean>