使用 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,PreparedStatement
s 和 ResultSet
s 也有同样的问题)
当我的 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 数据时出现问题的主要内容,如果未能解决你的问题,请参考以下文章
Oracle APEX 5.1使用JDBC和查询数据连接到远程数据库
高分求解,急!!!Java连接Oracle10g 问题 java.sql.SQLException: 无法从套接字读取更多的数据