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

2022-09-03 08:53:14

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

所有数据库访问都是使用IBATIS进行的(但我检测到我在使用JDBC,s和s时遇到了同样的问题)PreparedStatementResultSet

当我的java代码从第一个数据库中读取数据时,我会获得字符,就像它实际上必须是.写入此数据时无需修改第二个数据库。'ó''ó'

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

如果我使用...

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

...我正确地想象了字符(ó)。但是我不能将此解决方案用作一般规则,因为当我使用Web应用程序表单修改数据时,数据不会在我的第二个数据库中以UTF-8更新(尽管数据库是UTF-8并且我的连接字符串使用charthEncoding,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 读取 UTF-8 数据?mysql-connector-java-5.1.5-bin.jar

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


答案 1

有点晚,但这会帮助你:

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

答案 2

您可以将 JVM 的属性设置为 UTF-8,以便所有区分语言环境/编码的 API 都将解码字符串视为 UTF8。file.encoding

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

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

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


推荐