Springboot 插入mysql数据包含表情标错Incorr
2018-11-02 本文已影响0人
灿烂的黑土
项目上线后,一直很稳定,后来加入了微信登录后,有反馈说异常。排查得出结果是mysql插入的数据包含表情。特此记录下。
首先分析为什么会出现这样的情况,原因在于我们的评论数据中存在emoj表情,而这些表情是按照四个字节一个单位进行编码的,而我们通常使用的utf-8编码在mysql数据库中默认是按照3个字节一个单位进行编码的,正是这个原因导致将数据存入mysql数据库的时候出现错误,那么这个问题我们应该怎么解决呢?
-
mysql数据修改
- 检查数据库编码是不是uft8mb4
- 检查表内的要存储的字段是不是uft8mb4
- 手动sql插入条带表情的数据是不是成功。
-
修改springboot配置文件
- 如果是用的默认配置的话,那么需要在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 //这是最重要的一步
- 如果是使用的数据库连接池,那么需要手动配置。如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;
}