Springboot项目:mysql不支持存储表情符号的解决方法(druid连接池)


原因
mysql数据库的默认字符集utf8,只能存储3个字节的数据,标准的emoji表情是4个字节,所以要使用utf8mb4兼容四个字节。

解决方法

  1. 修改数据库的字符集
    先查看数据库的字符集属性,输入:

    show variables like '%character%';
    

    出现结果如图所示:
    mysql 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;
    
  2. 修改含有表情符号的字段编码类型为utf8mb4

    ALTER TABLE `表名` MODIFY COLUMN `字段名`  varchar(255) CHARACTER SET utf8mb4 NULL DEFAULT NULL COMMENT '注释';
    
  3. 修改对应的表的数据集

    ALTER TABLE `表名` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
    
  4. 更改数据库连接池配置
    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,如图最后一行所示:application.yml

注意:jdbc url连接参数characterEncoding=utf-8不变

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐