美文网首页
Springboot 插入mysql数据包含表情标错Incorr

Springboot 插入mysql数据包含表情标错Incorr

作者: 灿烂的黑土 | 来源:发表于2018-11-02 14:38 被阅读0次

    项目上线后,一直很稳定,后来加入了微信登录后,有反馈说异常。排查得出结果是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数据包含表情标错Incorr

          本文链接:https://www.haomeiwen.com/subject/wbfcxqtx.html