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

Posted

技术标签:

【中文标题】使用 JDBC 连接器 5.1 从 Java 读取/写入 MySQL 中的 UTF-8 数据时出现问题【英文标题】:Problems reading/writing UTF-8 data in MySQL from Java using JDBC connector 5.1 【发布时间】:2010-10-18 08:07:19 【问题描述】:

我有一个场景,其中包含两个 mysql 数据库(UTF-8)、一个同步两个数据库的 Java 代码(一个计时器服务)(首先读取它们并写入/更新到第二个)和一个允许修改的 Web 应用程序加载到第二个数据库中的数据。

所有数据库访问都是使用 IBATIS 进行的(但我发现使用 JDBC,PreparedStatements 和 ResultSets 也有同样的问题)

当我的 java 代码从第一个数据库读取数据时,我获得了像 'ó' 这样的字符,而实际上它必须是 'ó'。该数据无需修改即可写入第二个数据库。

稍后,当我在我的 Web 应用程序中看到加载的数据时,尽管有 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />,我还是看到了 extrange 字符。

如果我使用 ... 解码数据

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 数据?

是从第一个数据库读取数据还是写入第二个数据库有问题?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

在一般应用程序中,您不创建应用程序。所以你不能传递这个参数。有没有其他方法可以让我看完后改?/【参考方案2】:

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

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

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

您也可以参考this SO question 以获得有关 Tomcat 设置的完整说明。

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

必须有; UTF-8 之后。 @ScottChu 对不起,我不明白你的评论。

以上是关于使用 JDBC 连接器 5.1 从 Java 读取/写入 MySQL 中的 UTF-8 数据时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

从 JDBC 连接读取时如何使用谓词?

Oracle APEX 5.1使用JDBC和查询数据连接到远程数据库

高分求解,急!!!Java连接Oracle10g 问题 java.sql.SQLException: 无法从套接字读取更多的数据

JDBC java数据连接 读取properties 数据库连接池 预编译

java怎样将读取数据写入数据库

java(JDBC)用获取文件的方式连接数据库错误?