使用 JDBC 检索 latin1 编码的结果

Posted

技术标签:

【中文标题】使用 JDBC 检索 latin1 编码的结果【英文标题】:Retrieving latin1 encoded results with JDBC 【发布时间】:2011-07-29 17:51:30 【问题描述】:

我正在尝试从 mysql 数据库中检索结果集,然后使用 JDBC 生成 BiRT 中的报告。连接字符串在 BiRT 中设置。

数据库是latin1:

SHOW VARIABLES LIKE 'c%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     | 
| character_set_connection | latin1                     | 
| character_set_database   | latin1                     | 
| character_set_filesystem | binary                     | 
| character_set_results    | latin1                     | 
| character_set_server     | latin1                     | 
| character_set_system     | utf8                       | 
| character_sets_dir       | /usr/share/mysql/charsets/ | 
| collation_connection     | latin1_swedish_ci          | 
| collation_database       | latin1_swedish_ci          | 
| collation_server         | latin1_swedish_ci          | 
| completion_type          | 0                          | 
| concurrent_insert        | 1                          | 
| connect_timeout          | 5                          | 
+--------------------------+----------------------------+

所以我一直在尝试纠正返回的奇怪的编码结果(德语字符)。我认为使用“characterSetResults”属性将结果集检索为“latin1”对我们来说是有意义的,如下所示:

jdbc:mysql://localhost:3306/statistics?useUnicode=true&characterEncoding=latin1&characterSetResults=latin1

这个连接字符串失败了,通过推断我发现它是属性:

characterSetResults=latin1

导致连接失败。该错误是一个长 java 错误,对我来说意义不大。开头是:

org.eclipse.birt.report.data.oda.jdbc.JDBCException: There is an error in get connection, Communications link failure

Last packet sent to the server was 38 ms ago..
    at org.eclipse.birt.report.data.oda.jdbc.JDBCDriverManager.doConnect(JDBCDriverManager.java:262)
    at org.eclipse.birt.report.data.oda.jdbc.JDBCDriverManager.getConnection(JDBCDriverManager.java:186)
    at org.eclipse.birt.report.data.oda.jdbc.JDBCDriverManager.tryCreateConnection(JDBCDriverManager.java:706)
    at org.eclipse.birt.report.data.oda.jdbc.JDBCDriverManager.testConnection(JDBCDriverManager.java:634)
    at org.eclipse.birt.report.data.oda.jdbc.ui.util.DriverLoader.testConnection(DriverLoader.java:120)
    at org.eclipse.birt.report.data.oda.jdbc.ui.util.DriverLoader.testConnection(DriverLoader.java:133)
    at org.eclipse.birt.report.data.oda.jdbc.ui.profile.JDBCSelectionPageHelper.testConnection(JDBCSelectionPageHelper.java:687)
    at org.eclipse.birt.report.data.oda.jdbc.ui.profile.JDBCSelectionPageHelper.access$7(JDBCSelectionPageHelper.java:655)
    at org.eclipse.birt.report.data.oda.jdbc.ui.profile.JDBCSelectionPageHelper$7.widgetSelected(JDBCSelectionPageHelper.java:578)
    at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:234)

如果我将其更改为:

 characterSetResults=utf8

连接字符串连接没有错误,但编码问题仍然存在。

有人知道检索 latin1 的正确方法吗?是的,我知道要使用 UTF8,但这不是我的数据库....

感谢您阅读本文, 斯蒂芬

【问题讨论】:

我也有同样的问题。你解决了吗? 【参考方案1】:

经过一番挖掘,你试过characterSetResults=ISO8859_1吗?这相当于 latin1,并且有证据表明 MySQL 处理得更好。

我没有数据库来测试这个,但它看起来很符合我阅读的内容,可以满足您的需求。

【讨论】:

恐怕没有用。我认为唯一的办法是通过转储数据库将其转换为使用 UTF8,然后再次将其再次导入到其 UTF8 编码在CREATE DATABASE 子句中定义的数据库中。【参考方案2】:

在客户端指定字符编码时,使用Java风格的名称(Mysql connector-j-reference-charsets)。所以它应该通过使用 jdbc:mysql://localhost:3306/statistics?useUnicode=true&characterEncoding=utf-8&characterSetResults 来工作=Cp1252

【讨论】:

以上是关于使用 JDBC 检索 latin1 编码的结果的主要内容,如果未能解决你的问题,请参考以下文章

数据库写入中文乱码问题 编码latin1解决方法

如何使用 JDBC 从 Mysql 中检索正确编码的数据

使用 chardet 检测带有 JDBC 的 MySQL 数据库中的错误编码

使用 gcc 将字符串文字的编码设置为 latin1

MySQL编码latin1转utf8

从地理编码器 MapboxGl 检索数据(结果)