问题:
最近项目实施时部分繁体字生僻字入库测试时报错:
java.sql.SQLException: xxx.xxx.xxx.xxx:xxxx/schema1 | Incorrect string value: '\xF0\xA5\x96\x84' for column 'column_NAME' at row 1
其中:鱇輼緼 䲤㴝 顏艷詩媚陳㓇然刘㦤萱 鿇鿈鿉鿊鿋 入库正常。
𥖄 𥒚𦬣𩺰 𥖄𧝁 𤅡𣉞𢒼 入库报错!
解决方案:
1、检查mysql数据库版本:mysql数据库版本为5.7 ,支持 utf8mb4字符集;------满足要求
2、检查表和字段的字符集:表字符集默认为:utf8mb4,“DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin”------满足要求。
注意要去设置mysql数据库默认的字符集。
3、应用侧部分繁体字仍然报错解决方法:
方式1、升级到 mysql-connector-java驱动 到 5.1.47;
java:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
同时url里增加字符集设置characterEncoding=utf8: url="jdbc:mysql://xxx.xxx.xxx.xxx:xxxx/test?characterEncoding=utf8"
方式2:
通过 set names 命令设置会话字符集
String sqlCharset = "set names utf8mb4"
Statement statment = conn.createStatement();
resultSet = statment.executeQuery(sqlCharset);
每次执行sql前执行上述操作。
简单说 utf8mb4 是 utf8 的超集并完全兼容utf8,能够用四个字节存储更多的字符。
标准的 UTF-8 字符集编码是可以用 1~4 个字节去编码21位字符,这几乎包含了是世界上所有能看见的语言了。然而在MySQL里实现的utf8最长使用3个字节,也就是只支持到了 Unicode 中的 基本多文本平面(U 0000至U FFFF),包含了控制符、拉丁文,中、日、韩等绝大多数国际字符,但并不是所有,最常见的就算现在手机端常用的表情字符 emoji和一些不常用的汉字,如 “墅” ,这些需要四个字节才能编码出来。
也就是当你的数据库里要求能够存入这些表情或宽字符时,可以把字段定义为 utf8mb4,同时要注意连接字符集也要设置为utf8mb4。