这个问题,原因是UTF-8编码有可能是两个、三个、四个字节。Emoji表情或者某些特殊字符是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去。
Incorrect string value: '\xF0\x9F...' for column 'XXX' at row 1
网上的解决思路:在插入之前执行一条update语句:set names utf8mb4
但是我使用jdbcTemplate依然无法解决,最后只能绕个弯,换一个思路
- 把字符串直接Base64编码存库,取得时候再去解码,成功解决问题.
工具分享给大家:
/**
* 编码
*
* @param originStr
* @return
*/
private String encoder(String originStr) {
if (StringUtils.isBlank(originStr)) {
return originStr;
}
try {
BASE64Encoder encoder = new BASE64Encoder();
byte[] bytes = originStr.getBytes("UTF-8");
String encode = encoder.encode(bytes);
return encode;
} catch (UnsupportedEncodingException e) {
LOGGER.error(" encode error str {},e{}", originStr, e);
return originStr;
}
}
private String decoder(String originStr) {
BASE64Decoder decoder = new BASE64Decoder();
if (StringUtils.isNotEmpty(originStr)) {
try {
originStr = new String(decoder.decodeBuffer(originStr), "UTF-8");
} catch (IOException e) {
LOGGER.error(" decode error , e{}", e);
return originStr;
}
}
return originStr;
}