Springboot 插入mysql数据包含表情标错Incorrect string value: '\xF0\x9F\x98\x84\xF0\x9F

项目上线后,一直很稳定,后来加入了微信登录后,有反馈说异常。排查得出结果是mysql插入的数据包含表情。特此记录下。

首先分析为什么会出现这样的情况,原因在于我们的评论数据中存在emoj表情,而这些表情是按照四个字节一个单位进行编码的,而我们通常使用的utf-8编码在mysql数据库中默认是按照3个字节一个单位进行编码的,正是这个原因导致将数据存入mysql数据库的时候出现错误,那么这个问题我们应该怎么解决呢?

  1. mysql数据修改

    1. 检查数据库编码是不是uft8mb4
    2. 检查表内的要存储的字段是不是uft8mb4
    3. 手动sql插入条带表情的数据是不是成功。
  2. 修改springboot配置文件

    1. 如果是用的默认配置的话,那么需要在applciation.yml中增加如下:
spring:
 datasource:
   url: jdbc:mysql://XXX:3306/XXX?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&autoReconnect=true
   username: root
   password: root #
   tomcat:
     init-s-q-l: SET NAMES utf8mb4 //这是最重要的一步
  1. 如果是使用的数据库连接池,那么需要手动配置。如Druid:
        @Bean     //声明其为Bean实例
        @Primary  //在同样的DataSource中,首先使用被标注的DataSource
        public DruidDataSource dataSource() {
            DruidDataSource datasource = new DruidDataSource();
            datasource.setUrl(url);
            datasource.setUsername(username);
            datasource.setPassword(password);
            datasource.setDriverClassName(driverClassName);
            //configuration
            String connectionInitSqls = "SET NAMES utf8mb4";
            StringTokenizer tokenizer = new StringTokenizer(connectionInitSqls, ";");
            //重点设置该参数
            datasource.setConnectionInitSqls(Collections.list(tokenizer));
            //configuration
            datasource.setInitialSize(initialSize);
            datasource.setMinIdle(minIdle);
            datasource.setMaxActive(maxActive);
            datasource.setMaxWait(maxWait);
            datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
            datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
            datasource.setValidationQuery(validationQuery);
            datasource.setTestWhileIdle(testWhileIdle);
            datasource.setTestOnBorrow(testOnBorrow);
            datasource.setTestOnReturn(testOnReturn);
            datasource.setPoolPreparedStatements(poolPreparedStatements);
            datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
            try {
                datasource.setFilters(filters);
            } catch (SQLException e) {
                System.err.println("druid configuration initialization filter: " + e);
            }
            datasource.setConnectionProperties(connectionProperties);
            return datasource;
        }

你可能感兴趣的:(Springboot 插入mysql数据包含表情标错Incorrect string value: '\xF0\x9F\x98\x84\xF0\x9F)