使用JDBC连接器5.1从Java读取/写入MySQL中的UTF-8数据时出现问题

我有一个场景,有两个MySQL数据库(UTF-8),一个Java代码(一个定时服务),它同步两个数据库(首先读取表单并编写/更新到第二个)和一个允许修改数据加载的Web应用程序第二个数据库。

所有数据库访问都是使用IBATIS进行的(但我发现使用JDBC, PreparedStatementResultSet我遇到了同样的问题)

当我的java代码从第一个数据库读取数据时,我得到的字符就像'ó' ,实际上它必须是'ó' 。 这些数据是在没有修改第二个数据库的情况下编写的。

后来,当我在我的Web应用程序中看到加载的数据时,尽管 ,我看到了外部字符。

如果我使用…解码数据

 new String(data.getBytes("UTF-8")); 

……我正确地想象了角色(ó)。 但我不能将此解决方案作为一般规则使用,因为当我使用Web应用程序表单修改数据时,我的第二个数据库中的数据不会以UTF-8更新(尽管数据库是UTF-8且我的连接字符串使用了字符编码, characterSetResults和useUnicode参数)。

从我的Java代码中获取以下数据库设置:

 character_set_client-->utf8 character_set_connection-->utf8 character_set_database-->utf8 character_set_filesystem-->binary character_set_results-->utf8 character_set_server-->latin1 character_set_system-->utf8 character_sets_dir-->/usr/local/mysql51/share/mysql/charsets/ 

character_set_server设置无法更改,我不知道我做错了什么!!

如何使用JDBC连接器( mysql-connector-java-5.1.5-bin.jar )从MySQL读取UTF-8数据?

从第一个数据库读取数据或写入第二个数据库的问题是什么?

有点晚了,但这会对你有所帮助:

 DriverManager.getConnection( "jdbc:mysql://" + host + "/" + dbName + "?useUnicode=true&characterEncoding=UTF-8", user, pass); 

您可以将JVM的file.encoding属性设置为UTF-8,这样所有区域设置/编码敏感API都会将解码后的字符串视为UTF8。

例如,您可以在启动Java应用程序的命令行中进行设置:

 java -Dfile.encoding=UTF-8 .... 

您还可以参考此SO问题以获取有关Tomcat设置的完整说明。

在链中的某个点上,UTF-8编码的字节正在用Latin1进行解码。 从您的设置列表中可以看出,这发生在“character_set_server”。 在不知道如何获得这些价值的情况下,很难解释它们。

检查系统属性 “file.encoding”的值。 如果不是“UTF-8”,那么只要将字节解码为字符,就需要明确指定“UTF-8”作为字符编码。 例如,当您使用byte[]调用String构造函数时,或使用InputStreamReader

最好明确指定字符编码,而不是依赖于默认的平台编码。