mysql保存emoji表情的问题
起因
默认的utf-8编码支持的一个字符最多是3个字节,而手机输入法中的emoji表情是4个字节,所以保存时会报错.
解决方案
utf8的超集utf8mb4一个字符最多能有4字节,支持emoji表情的存储。
操作步骤
1.修改mysql配置
打开my.cnf文件(一般在/etc下),加入配置
[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'
2.修改数据库/表/字段
ALTER DATABASE 数据库名 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE 表名 CHANGE 字段名 字段名 该字段原来的数据类型 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
也可以直接在navicate中修改
3.查询编码
重启mysql
service mysqld restart
进入mysql后 查询
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
显示如下
+--------------------------+--------------------+
| 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 |
| collation_connection | utf8mb4_unicode_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+--------------------------+--------------------+
4.修改项目
去掉配置里边jdbc关于characterEncoding=utf-8的部分
如果使用阿里数据源,spring框架下面的配置只需增加一行设置即可。
<!-- 阿里 druid数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="url" value="${url}" />
<property name="username" value="${username}" />
......
<property name="connectionInitSqls" value="set names utf8mb4;"/>
在dataSource 内增加这一行 配置即可解决问题。
注意事项
网上说5.5.3以后才支持utf8mb4,实测5.5.28也可以
来源:oschina
链接:https://my.oschina.net/u/4330731/blog/4198075