java.sql.SQLException : Incorrect string value: '\xF0\x9F\x91\xBD\xF0\x9F...'

标签 java mysql encoding character-encoding sqlexception

我有以下字符串值:“walmart obama 👽💔”

我正在使用 MySQL 和 Java。

我收到以下异常:`java.sql.SQLException: Incorrect string value: '\xF0\x9F\x91\xBD\xF0\x9F...'

这是我要插入的变量:

var1 varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL`

我试图插入“walmart obama 👽💔”的 Java 代码是一个preparedStatement。所以我使用的是 setString() 方法。

看起来问题在于值的编码👽💔。我怎样才能解决这个问题?以前我使用的是 Derby SQL,而值 👽💔 最终变成了两个正方形(我认为这是空字符的表示)

非常感谢所有帮助!

最佳答案

你拥有的是EXTRATERRESTRIAL ALIEN (U+1F47D)BROKEN HEART (U+1F494)哪个 不在基本的多语言平面上。它们甚至不能在 java 中表示为一个字符 "👽💔".length() == 4。它们绝对不是空字符,如果您不使用支持它们的字体,就会看到方 block 。

MySQL's utf8 only supports basic multilingual plane, and you need to use utf8mb4 instead :

For a supplementary character, utf8 cannot store the character at all, while utf8mb4 requires four bytes to store it. Since utf8 cannot store the character at all, you do not have any supplementary characters in utf8 columns and you need not worry about converting characters or losing data when upgrading utf8 data from older versions of MySQL.

所以要支持这些字符,你的 MySQL 需要 5.5+ 并且你需要在任何地方使用 utf8mb4。连接编码需要utf8mb4,字符集需要utf8mb4,collaction需要utf8mb4。对于 java 来说仍然只是 "utf-8",但是 MySQL 需要区分一下。

我不知道您使用的是什么驱动程序,但设置连接字符集的与驱动程序无关的方法是发送查询:

SET NAMES 'utf8mb4'

在建立连接之后。

See also this for Connector/J :

14.14: How can I use 4-byte UTF8, utf8mb4 with Connector/J?

To use 4-byte UTF8 with Connector/J configure the MySQL server with character_set_server=utf8mb4. Connector/J will then use that setting as long as characterEncoding has not been set in the connection string. This is equivalent to autodetection of the character set.

同时调整列和数据库:

var1 varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL

同样,您的 MySQL 版本需要相对最新才能支持 utf8mb4。

关于java.sql.SQLException : Incorrect string value: '\xF0\x9F\x91\xBD\xF0\x9F...' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13653712/

相关文章:

java - JAVA中的数据结构实现连接

java - 将多个对象写入包

mysql - 从第三张表中获取数据

python - 为什么字符串对象的 IronPython str() 会引发 UnicodeEncodeError?

Android MediaCodec - 将音频动态编码为 aac

java - 使用静态内部类时构建错误

java - 英文标尺递归问题

MySQL 5.7 按特定的 30 分钟间隔分组

php - 查询此错误是什么?

mysql - 服务器端 Spring + Freemarker + Hibernate(EM) + MySql UTF-8 字符