MySQL 5.5 Connector/J 字符集编码(utf8mb4)问题

3
我正在尝试将utf8mb4字符串正确地存储到MySQL 5.5.30中。我们使用的是ConnectorJ 5.1.18。

根据文档,ConnectorJ应该根据character_set_server变量自动检测字符编码......

然而,据我所知,它总是默认为SET NAMES latin1而不是SET NAMES utf8mb4

来自连接器-J分析仪的日志输出:
Sat Jul 06 15:45:20 CDT 2013 信息: 分析器事件: [查询] java.sql.DriverManager.getConnection(DriverManager.java:579) 持续时间: 1 毫秒, 连接 ID:57,语句 ID:3,结果集 ID:4,消息: /* mysql-connector-java-5.1.18 ( Revision: tonci.grgin@oracle.com-20110930151701-jfj14ddfq48ifkfq ) */SHOW VARIABLES WHERE Variable_name ='language' OR Variable_name = 'net_write_timeout' OR Variable_name = 'interactive_timeout' OR Variable_name = 'wait_timeout' OR Variable_name = 'character_set_client' OR Variable_name = 'character_set_connection' OR Variable_name = 'character_set' OR Variable_name = 'character_set_server' OR Variable_name = 'tx_isolation' OR Variable_name = 'transaction_isolation' OR Variable_name = 'character_set_results' OR Variable_name = 'timezone' OR Variable_name = 'time_zone' OR Variable_name = 'system_time_zone' OR Variable_name = 'lower_case_table_names' OR Variable_name = 'max_allowed_packet' OR Variable_name = 'net_buffer_length' OR Variable_name = 'sql_mode' OR Variable_name = 'query_cache_type' OR Variable_name = 'query_cache_size' OR Variable_name = 'init_connect'
Sat Jul 06 15:45:20 CDT 2013 信息: 分析器事件: [抓取] java.sql.DriverManager.getConnection(DriverManager.java:579) 持续时间: 0 毫秒, 连接 ID:57,语句 ID:3,结果集 ID:4
Sat Jul 06 15:45:20 CDT 2013 信息: 分析器事件: [查询] java.sql.DriverManager.getConnection(DriverManager.java:579) 持续时间: 0 毫秒, 连接 ID:57,语句 ID:3,结果集 ID:5,消息: /* mysql-connector-java-5.1.18 ( Revision: tonci.grgin@oracle.com-20110930151701-jfj14ddfq48ifkfq ) */SELECT @@session.auto_increment_increment
Sat Jul 06 15:45:20 CDT 2013 信息: 分析器事件: [抓取] java.sql.DriverManager.getConnection(DriverManager.java:579) 持续时间: 0 毫秒, 连接 ID:57,语句 ID:3,结果集 ID:5
Sat Jul 06 15:45:20 CDT 2013 信息: 分析器事件: [查询] java.sql.DriverManager.getConnection(DriverManager.java:579) 持续时间: 0 毫秒, 连接 ID:57,语句 ID:4,结果集 ID:6,消息: SHOW COLLATION
Sat Jul 06 15:45:20 CDT 2013 信息: 分析器事件: [抓取] java.sql.DriverManager.getConnection(DriverManager.java:579) 持续时间: 3 毫秒, 连接 ID:57,语句 ID:4,结果集 ID:6
Sat Jul 06 15:45:20 CDT 2013 信息: 分析器事件: [查询] java.sql.DriverManager.getConnection(DriverManager.java:579) 持续时间: 1 毫秒, 连接 ID:57,语句 ID:999,结果集 ID:0,消息: SET NAMES latin1

SHOW VARIABLES调用的输出如下:

character_set_client        utf8
character_set_connection    utf8
character_set_results       utf8
character_set_server        utf8mb4

服务器正在运行中,因此为了更新character_set_server值,我只需运行SET GLOBAL和SET语句。

更新: 当我在my.cnf中更改character_set_server值并重新启动服务器时,ConnectorJ会正确检测到utf8mb4。

但是,当我使用SET GLOBAL手动设置值时,ConnectorJ仍将使用Latin1。

有人知道为什么会这样吗?是否有任何方法能够以不让mysql脱机的方式更新字符集从而使ConnectorJ检测到更新后的字符集?

1个回答

1

我有类似的问题。过去,ConnectorJ 的客户端字符集握手使用的是常规/不完整的 utf8 字符集,而不是 utf8mb4

https://dev.mysql.com/doc/relnotes/connector-j/en/news-5-1-13.html

修复了自5.1.12版本以来发现的漏洞。Connector/J现在可以自动检测配置为character_set_server=utf8mb4的服务器,或者在建立连接时将使用characterEncoding=...传递的Java编码utf-8视为utf8mb4并在SET NAMES=调用中使用。(Bug #54175)
然而,升级ConnectorJ并没有解决任何问题。顺便说一句,感谢您找出了更改配置文件可以解决问题,而在运行时更改值则无法解决问题。这节省了我很多时间。
对于任何遇到相同问题但由于某种原因无法重启服务器的人,我建议(与MySQL文档相反,该文档表示在要使用utf8mb4时应省略连接字符串中的characterEncoding)将characterEncoding=UTF-8添加到连接字符串中,并在遇到问题的连接上手动执行SET NAMES utf8mb4。

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