问题描述:项目中需要存储微信昵称,有些昵称中包含emoji表情导致mysql存储报错,tomcat错误如下:
Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x97\xF0\x9F...' for column 'nick_name' at row 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
当前版本情况:mysql-connector-java:5.1.34 mysql:5.1
字符编码格式:
问题引发:utf8编码一个字符可能是2,3或者4个字节,而mysql的utf8编码一个字符最多存储三个字节,emoji表情是4个字节。
问题解决:需要将mysql编码从utf8修改为utf8mb4,utf8mb4扩展到一个字符最多能有4个字节,所以能支持更多的字符集。
版本需求:utf8mb4需求MySQL5.5以上版本,从库5.5以上低版本不支持此字符集。
具体修改方法如下:
1 mysql配置文件(my.cnf/mysql.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'
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
2 修改数据库字符集:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
3 修改相应表字段字符集为utf8mb4
ALTER TABLE tbl_donate_order MODIFY `user_name` VARCHAR(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
4 修改对应表字符集utf8mb4
ALTER TABLE tbl_donate_order CHARSET=utf8mb4
验证表及字段字符集修改是否成功