从 Java 中检索具有国际名称的 MS Access 列(编码)
Posted
技术标签:
【中文标题】从 Java 中检索具有国际名称的 MS Access 列(编码)【英文标题】:Retrieving MS Access column with international name from Java (encoding) 【发布时间】:2011-06-28 12:01:11 【问题描述】:我需要从一些旧的 Access 数据库中导入数据。我用一些数据库文件运行代码,一切都很顺利。现在,我尝试了另一个,但相同的代码不起作用。
它似乎与字符编码有关,虽然我没有指定任何内容(也不知道在哪里做)。
Double age = resultSet.getDouble("âge");
在第一个 db 文件上工作,在另一个 db 文件上给出一个带有“找不到列”的 SQLException。在有问题的数据库上,resultSet.getMetaData().getColumnName(3)(同一列)给出“?ge”。
更新:似乎结果实际上在数据库之间是一致的。我看到的不同是因为第一次导入是从 EJB 项目中的类运行的(我运行了某个类的 main 方法,而不是应用服务器中的 EJB 模块)。第二次导入是在一个新的独立项目上完成的。独立的 Java 项目总是因为这个异常而失败,但在第一个项目中运行相同的代码总是可以的。
问题在这里提出了另一种方式:https://***.com/questions/6519517/getting-ms-access-column-with-international-character-from-java
【问题讨论】:
我建议您使用resultSet.getDouble(int)
来避免将来出现错误。
不保证列顺序
您可能在数据库中使用iso-8859-1
字符集,那么您必须使用字符集转换器将字符串âge
转换为age
,然后才能获取该列中的数据。另一种解决方法是将数据库的字符集更改为utf8
或utf16
@Rakesh:我不知道 access 如何在内部对数据库进行编码。对于体面的数据库,jdbc 的责任(有时需要配置)为应用程序提供翻译的 java 字符串,因此重音应该出现并正确解码。奇怪的是,正如我所说,我将代码从一个项目复制/粘贴到另一个项目。它在项目 1 中有效(使用“âge”没有错误),但在项目 2 中无效。
检查 java 源文件的字符集。你在使用 Eclipse 吗?如果是,您可以使用上下文菜单属性选项比较两个项目源文件。
【参考方案1】:
通过 JDBC-ODBC 桥和 Access ODBC 驱动程序操作 Access 数据库只能对 Windows-1252 字符集中包含的重音字符可靠地工作。在这些情况下,您必须在 Eclipse 中将 Java 源文件的字符编码设置为 cp1252
(或在 NetBeans 中将项目的字符编码设置为 windows-1252
)。如果您的 Java 源文件被编码为 UTF-8,那么如果涉及重音字符,您的代码将不起作用。 (更多详情见我的另一个回答here。)
要获得更完整的 Unicode 字符支持,请考虑改用 UCanAccess。
【讨论】:
它们确实存在于两个字符集中,这不是问题。以上是关于从 Java 中检索具有国际名称的 MS Access 列(编码)的主要内容,如果未能解决你的问题,请参考以下文章
尝试从 MS Access DB 检索字段值时,Java 中的希腊词作为问号 [重复]
如何在 ms-access VBA 中检索表的 odbc 数据库名称