mysql存储emoji表情

2015-12-21  文晶 

问题描述:项目中需要存储微信昵称,有些昵称中包含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'

修改完成后重启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         

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

验证表及字段字符集修改是否成功


字符集修改完成,emoji表情存储成功


258°|2575 人阅读|1 条评论

小窝  2015-12-21

学习

登录 后发表评论