我正在尝试将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检测到更新后的字符集?