項目上線后濒生,一直很穩(wěn)定健爬,后來加入了微信登錄后控乾,有反饋說異常。排查得出結(jié)果是mysql插入的數(shù)據(jù)包含表情娜遵。特此記錄下阱持。
首先分析為什么會出現(xiàn)這樣的情況,原因在于我們的評論數(shù)據(jù)中存在emoj表情魔熏,而這些表情是按照四個字節(jié)一個單位進(jìn)行編碼的衷咽,而我們通常使用的utf-8編碼在mysql數(shù)據(jù)庫中默認(rèn)是按照3個字節(jié)一個單位進(jìn)行編碼的,正是這個原因?qū)е聦?shù)據(jù)存入mysql數(shù)據(jù)庫的時候出現(xiàn)錯誤蒜绽,那么這個問題我們應(yīng)該怎么解決呢镶骗?
-
mysql數(shù)據(jù)修改
- 檢查數(shù)據(jù)庫編碼是不是uft8mb4
- 檢查表內(nèi)的要存儲的字段是不是uft8mb4
- 手動sql插入條帶表情的數(shù)據(jù)是不是成功。
-
修改springboot配置文件
- 如果是用的默認(rèn)配置的話躲雅,那么需要在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 //這是最重要的一步
- 如果是使用的數(shù)據(jù)庫連接池鼎姊,那么需要手動配置。如Druid:
@Bean //聲明其為Bean實例
@Primary //在同樣的DataSource中相赁,首先使用被標(biāo)注的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, ";");
//重點設(shè)置該參數(shù)
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;
}