mysql不能保存emoji表情的问题处理

社会主义新天地 提交于 2021-01-13 00:34:22

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也可以

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!