项目上线后,一直很稳定,后来加入了微信登录后,有反馈说异常。排查得出结果是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=trueusername: rootpassword: root #tomcat:init-s-q-l: SET NAMES utf8mb4 //这是最重要的一步
- 如果是使用的数据库连接池,那么需要手动配置。如Druid:
@Bean //声明其为Bean实例@Primary //在同样的DataSource中,首先使用被标注的DataSourcepublic DruidDataSource dataSource() {DruidDataSource datasource = new DruidDataSource();datasource.setUrl(url);datasource.setUsername(username);datasource.setPassword(password);datasource.setDriverClassName(driverClassName);//configurationString connectionInitSqls = "SET NAMES utf8mb4";StringTokenizer tokenizer = new StringTokenizer(connectionInitSqls, ";");//重点设置该参数datasource.setConnectionInitSqls(Collections.list(tokenizer));//configurationdatasource.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;}