mysql存储emoji表情报错处理,qq互联mysql存储昵称中带表情的数据时报错。

前言
 

    做qq互联登录时发现一个问题,如果qq昵称中有表情时存入mysql数据库会报错。

java.sql.SQLException: Incorrect string value: "ð" for colum n "name" at row 1
 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593)
 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525)
 
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986)
 
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140)
 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2620)
 
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1662)
 
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1581)

 

 原因是:mysql的utf8编码的一个字符最多3个字节,但是一个emoji表情为4个字节,所以utf8不支持存储emoji表情。但是utf8的超集utf8mb4一个字符最多能有4字节,所以能支持emoji表情的存储。

 

解决方法

    1.修改mysql 配置文件/etc/my.cnf(window为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"

 

注意:mysql支持utf8mb4的版本是5.5.3+,必须升级到较新版本    

    2.修改database,table,column字符集   

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
 
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 
ALTER TABLE table_name CHANGE column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

 

3.java语言修改db配置文件

jdbc_driverClassName =com.mysql.jdbc.Driver
 
jdbc_url=jdbc:mysql://localhost:3306/databaseName?useUnicode=true&autoReconnect=true&rewriteBatchedStatements=TRUE
 
jdbc_username=root
 
jdbc_password=root

 

其中的characterEncoding=utf8可以自动被识别为utf8mb4(兼容原来的utf8),而

autoReconnection(当数据库连接异常中断时,是否自动重新连接?默认为false)强烈建议配上,忽略这个属性,可能导致缓存缘故 ,
没有读取到DB最新的配置,导致一直无法试用utf8mb4字符集; 
记得要去掉characterEncoding=UTF-8”,因为mysql.cnf中已设置了init_connect="SET NAMES utf8mb4",否则还是不能保存哦

    4.重启mysql服务 检查是否配置成功

mysql> show variables like "%char%";
 
+--------------------------+----------------------------------+
 
| 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 |
 
| character_sets_dir | /usr/local/mysql/share/charsets/ |
 
+--------------------------+----------------------------------+

 

    然后就可以愉快的登录啦。

原文地址:https://www.wanpishe.top/detail?blogId=1f422a92-a957-4132-a405-a702484490b6

posted @ 2018-12-17 15:31  粉红顽皮蛇  阅读(527)  评论(0编辑  收藏  举报