使用Hibernate将Emoji保存到MySQL中时出现错误:在第1行,名称列的值'\xF0\x9F\x98\x88\xF0\x9F...'不正确。

3
我的连接字符串具有以下属性:useUnicode=true&characterEncoding=utf8&character_set_server=utf8mb4&charset=utf8mb4。
我使用了:
    jpaProperties.put("hibernate.connection.useUnicode", true);
    jpaProperties.put("hibernate.connection.characterEncoding", "utf8");
    jpaProperties.put("hibernate.connection.CharSet", "utf8mb4");

当我手动添加记录时,该数据库也支持utf8mb4,因为它可以正确保存。

但在尝试保存表情符号时仍然出现错误。

Incorrect string value: '\xF0\x9F\x98\x88\xF0\x9F...' for column 'name' at row 1

请在实体代码中注释字段,以便我们可以查看您是如何注释的。 - Tasos P.
2个回答

0

我相信你已经清楚地表达了你想要在整个技术栈中使用UTF-8的意图...除了你的数据。

你真正的问题在于,你的数据(原始字符串)一开始就不是有效的UTF-8。你可以使用以下代码片段轻松验证:

public static boolean isValidUTF8(byte[] input) {
        CharsetDecoder utf8Decoder = Charset.forName("UTF-8").newDecoder();
        try {
            utf8Decoder.decode(ByteBuffer.wrap(input));
            return true;
        } catch (CharacterCodingException e) {
            return false;
        }
    }

你应该全部使用utf8mb4(包括列定义,应为... CHARSET=utf8mb4 COLLATE utf8mb4_general_ci... CHARACTER SET utf8mb4 COLLATE utf8mb4_bin)。

根据文档,你需要特别注意MySQL连接器版本(和配置)。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接