现象:保存数据时出现类似以下的错误:
java.sql.SQLException: Incorrect string value: '\xF4\x80\x8E\xAE\xE8\x83...' for column 'CP_PUBLISHING' at row 1
原因:保存的字符中含有4字节的字符,表情符号(emoji)和一些生僻的汉字是4字节的字符。UTF-8编码只支持1-3个字节、所以当UTF-8字段存入4字节字符时就会报错。MYSQL5.5起、开始支持4字节字符。需将字段编码设置为utf8mb4. utf8是utf8mb4的子集,utf8mb4兼容utf8.
支持4字节字符的前提:
1)mysql升级到5.5+版本
2)将字段编码修改为utf8mb4
3)数据库连接串中增加:autoReconnect=true&characterEncoding=utf-8
如:"jdbc:mysql://172.23.1.1:3306/nrps?autoReconnect=true&characterEncoding=utf-8"
除此之外还需要做以下步骤:
方案一:修改全局变量my.cnf
方案二:在数据库连接串中增加init_connect_sql SET NAMES utf8mb4
本文以druid连接池为例说明、其他连接池init_connect_sql的配置另查。
[
{
"dsName": "tyyd_mysql",
"url": "jdbc:mysql://172.23.1.1:3306/nrps?autoReconnect=true&characterEncoding=utf-8",
"username": "nrps",
"validationQuery":"select 1",
"filters": "config",
"poolPreparedStatements":false,
"connectionProperties": "config.decrypt=true",
"password": "xxx",
connectionInitSqls: ["set names utf8mb4;"],
}
]