JDBC和utf8mb4编码表情符号

时间:2017-11-01 17:49:18

标签: java mysql jdbc emoji utf8mb4

我使用Mysql 5.7.18,从JDBC更新时遇到表情符号问题。

创建表:body已键入utf8localizationsutf8mb4

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选项,这里是utf8utf8mb4之间的差异:

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

仍然是同一个问题。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

错误消息说(我认为)没有告诉JDBC utf8mb4 ...

我怀疑useEncoding是一个错字:

?useUnicode=yes&characterEncoding=UTF-8  -- in the getConnection() call. 

http://mysql.rjweb.org/doc.php/charcoll#best_practice

答案 1 :(得分:0)

我面临着同样的问题。我在会话变量中发现了

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配置中删除了characterEncoding,charSet和useEncoding属性,并使用重启了mysql服务器

--character-set-server=utf8mb4

像魅力一样工作!