我使用MySQL5.7.18,当我从JDBC更新时,我遇到了一个表情符号的问题。
表创建:body类型为utf8,localizations类型为utf8mb4
CREATE TABLE `my_table` (
`body` TEXT NOT NULL,
`localizations` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8;现在我使用SequelPro插入数据。为了正确执行此操作,我按下了Database -> View using encoding -> utf8mb4。插入代码:
INSERT INTO my_table(body, localizations) VALUES ('test', '');然后我尝试从jdbc加载它。这里是目前工程中使用的连接字符串部分(这里使用格式化只是为了方便阅读):
?useEncoding=true
&characterEncoding=UTF-8它成功地从数据库加载localizations。但是从JDBC更新表返回错误:
SQLException: Incorrect string value: '\xF0\x9F\x94\xA5"}...' for column 'localizations'我想这是因为连接编码的原因。SequelPro有一个Show server variables选项,下面是utf8和utf8mb4之间的区别
character_set_client = utf8mb4
character_set_connection = utf8mb4
character_set_results = utf8mb4
collation_connection = utf8mb4_general_ci所以我尝试修改连接字符串:
?useEncoding=true
&characterEncoding=UTF-8
&sessionVariables=
character_set_client=utf8mb4,
character_set_connection=utf8mb4,
character_set_results=utf8mb4,
collation_connection=utf8mb4_general_ci仍然是同样的问题。有什么建议吗?
发布于 2017-11-07 22:52:02
错误消息说(我想) JDBC没有被告知utf8mb4...
我怀疑useEncoding是个打字错误:
?useUnicode=yes&characterEncoding=UTF-8 -- in the getConnection() call. http://mysql.rjweb.org/doc.php/charcoll#best_practice
发布于 2019-03-06 18:13:32
我也面临着同样的问题。我在会话变量中发现
character_set_client=utf8mb4
但
character_set_server=utf8
如下面的链接所示,
https://dev.mysql.com/doc/refman/5.7/en/charset-server.html
https://docs.oracle.com/cd/E17952_01/connector-j-en/connector-j-reference-charsets.html
我从JDBC config中删除了characterEncoding、charSet和useEncoding属性,并使用以下命令重新启动了mysql服务器:
--character-set-server=utf8mb4
像护身符一样工作!
发布于 2021-11-21 09:39:13
如果您使用的是旧版本的mysql-connector-java,请考虑升级到新版本。将mysql-connector-java从5.1.31升级到5.1.49解决了我的问题。我的JDBC_URL是"jdbc:mysql://{HOST}:{PORT}/{DBNAME}?useUnicode=true&characterEncoding=utf-8";
https://stackoverflow.com/questions/47060827
复制相似问题