【问题标题】:Java ODBC MS-Access Unicode character problemsJava ODBC MS-Access Unicode 字符问题
【发布时间】:2023-04-10 21:40:01
【问题描述】:

我正在尝试制作一个连接到 Access 数据库的应用程序。我已经通过使用 .mdb 文件建立我的 Java 程序的 ODBC 连接,但是我遇到了 Unicode 字符的问题。如果记录是用英语(拉丁语)字符编写的,那么 .mdb 文件会识别这些字符,但如果记录是用希腊语编写的,则会出现一些奇怪的字符,并且我无法使用 ResultSet 对象获取记录。有人可以帮忙吗?

【问题讨论】:

  • 一些 dbs 对非 ascii 数据有不同的数据类型。 Java 字符串设计为 Unicode
  • 问题是当我从我的 db java 获取记录时,我理解非 ascii 字母并将它们转换为希腊语,但是当我获取所有记录时就会发生这种情况。这意味着我无法搜索特定名称,例如导致无法识别
  • 好的,但我如何使用 UCanAccess?
  • 我正在使用 netbeans ide

标签: java ms-access jdbc odbc jdbc-odbc


【解决方案1】:

当字符串包含代码点高于 U+007F 的 Unicode 字符时,JDBC-ODBC 桥将无法与 Access ODBC 驱动程序一起正常工作。希腊字符属于该类别,因此 JDBC-ODBC 桥方法不适合您。 (更多细节here。)此外,JDBC-ODBC 桥已从 Java 中删除(自 Java 8 起)。

要获得对希腊字符的适当支持,我建议使用UCanAccess。有关如何设置的概述,请参阅我的另一个答案 here

一旦您的项目被配置为使用 UCanAccess,您就可以使用如下代码使用您的 Access 数据库:

Connection conn=DriverManager.getConnection(
        "jdbc:ucanaccess://C:/__tmp/unicode.accdb");
String language = "Greek";

PreparedStatement ps = conn.prepareStatement(
        "SELECT [word], [english_equiv] " +
        "FROM [vocabulary] " +
        "WHERE language=?");
ps.setString(1, language);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
    System.out.println(String.format(
            "\"%s\" is %s for \"%s\".", 
            rs.getString("word"),
            language,
            rs.getString("english_equiv")));
}
rs.close();
ps.close();

String newWord = "ηλεκτρονικός υπολογιστής";
String newEnglishEquiv = "computer";
ps = conn.prepareStatement(
        "INSERT INTO [vocabulary] ([word], [language], [english_equiv]) " +
        "VALUES (?,?,?)");
ps.setString(1, newWord);
ps.setString(2, language);
ps.setString(3, newEnglishEquiv);
ps.executeUpdate();
System.out.println(String.format(
        "\"%s\" has been added to the table.", 
        newWord));

该代码产生以下控制台输出:

"γιορτή" is Greek for "feast"
"ηλεκτρονικός υπολογιστής" has been added to the table.

(翻译由Google Translate提供。)

【讨论】:

  • 非常感谢您,先生!我真的很感谢你的时间!!我认为这解决了我的问题 :D !!
  • 我可以问另一个问题.. 当我尝试执行 rs.last();命令,它给了我这个错误:net.ucanaccess.jdbc.UcanaccessSQLException: feature not supported。为什么会这样?
【解决方案2】:

如果调用 ResultSet.first() 或 ResultSet.last(),则必须正确初始化 Statement 或 PreparedStatement:

PreparedStatement ps =conn.prepareStatement("SELECT *  FROM T1",ResultSet.TYPE_SCROLL_INSENSITIVE,
                ResultSet.CONCUR_READ_ONLY);

@Gord,感谢您为 UCanAccess 所做的一切。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    相关资源
    最近更新 更多