UTF-8可能是我们使用的最多的一种字符编码,一直以其支持的广泛的字符被人称道,我也经常在项目中使用它,至到遇到了:SQL state [HY000]; error code [1366]; Incorrect string value: '\xF0\x9F\x92\x8BRo...' for column
DB环境:mysql,
字符集编码: utf8
这是在jdbc中执行的时候出现的问题,如果将出错的sql语句在command中执行,不是会出错的,为什么呢?
在mysql 中规定utf8的字符的最大长度为3(maxLen=3), 但是一些unicode字符在转成utf8编码之后有4字节的
长度,所以就出错了。
例如: *号在转为utf8时为 f0 9f 8d 8e
String c = "*";
byte[] bytes = c.getBytes("utf8");
for (byte b : bytes){
System.out.print(Integer.toHexString(0x00FF &b)+" ");
} // 输出 f0 9f 8d 8e
好在mysql 早为我们想好了这些,那如何办呢?
只需将出错的列的编码更改为utf8mb4就行了, what is mb4 means? max byte ?
ALTER TABLE {yourTable} MODIFY {column} VARCHAR(45)
CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;