Springboot项目:mysql不支持存储表情符号的解决方法(druid连接池)
原因
mysql数据库的默认字符集utf8,只能存储3个字节的数据,标准的emoji表情是4个字节,所以要使用utf8mb4兼容四个字节。
解决方法
-
修改数据库的字符集
先查看数据库的字符集属性,输入:show variables like '%character%';
出现结果如图所示:
将utf8改成uftmb4:set character_set_client = utf8mb4; set character_set_server = utf8mb4; set character_set_connection = utf8mb4; set character_set_database = utf8mb4; set character_set_results = utf8mb4; set collation_connection = utf8mb4_general_ci; set collation_database = utf8mb4_general_ci; set collation_server = utf8mb4_general_ci;
-
修改含有表情符号的字段编码类型为utf8mb4
ALTER TABLE `表名` MODIFY COLUMN `字段名` varchar(255) CHARACTER SET utf8mb4 NULL DEFAULT NULL COMMENT '注释';
-
修改对应的表的数据集
ALTER TABLE `表名` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
-
更改数据库连接池配置
1)直接在数据源的xml文件中设置连接初始化语句set names utf8mb4
,以下是druid连接池的配置:<property name="connectionInitSqls" value="set names utf8mb4;"/>
2)若为自己编写的数据源类,则进行如下配置:
以我的项目为例:在DruidProperties.java(数据源配置类)中添加成员变量
connectionInitSqls
以及其setter getter
函数,并在配置函数config()
中添加dataSource.setConnectionInitSqls(Arrays.asList(connectionInitSqls));
private String[] connectionInitSqls; public String[] getConnectionInitSqls() { return connectionInitSqls; } public void setConnectionInitSqls(String[] connectionInitSqls) { this.connectionInitSqls = connectionInitSqls; } public void config(DruidDataSource dataSource) { ... dataSource.setConnectionInitSqls(Arrays.asList(connectionInitSqls)); ... }
最后在配置文件application.yml中添加
connection-init-sqls: set names utf8mb4
,如图最后一行所示:
注意:jdbc url连接参数characterEncoding=utf-8
不变