使用JDBC处理包含Unicode(旁遮普语、印地语)数据和表/列名的Access数据库



My Access数据库有一个表,其中有一列包含旁遮普语文本。我正在尝试使用JDBC从Java(NetBeans)中处理该数据库。

我的代码是:

private void b1ActionPerformed(java.awt.event.ActionEvent evt)
{                                   
  try
  {                     
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + "D:\PP.accdb";
    Connection conn = DriverManager.getConnection(url);
        System.out.println("Connection Successful");
        Statement stmt = conn.createStatement();
        stmt.execute("select * from Emp");
    ResultSet rs = stmt.getResultSet(); 
    if (rs != null)
        {  
                String s1,s2;
            s1=" ";
            s2=" ";
                while ( rs.next() )
                 {
                JOptionPane.showMessageDialog(null ,rs.getString(2), "Output" ,JOptionPane.INFORMATION_MESSAGE );
                 }
    }
            stmt.close();
            conn.close();
    }
    catch (Exception err) {         System.out.println("ERROR: " + err);         }
}                                  
2015年8月发布的UCanAccess 3.x版本现在支持表和列名中的Unicode字符。请注意,这些名称需要用方括号括起来,至少对于UCanAccess v3.0.0,例如:
sql = "SELECT [रंग], inEnglish FROM hindi";

 


(原始答案)

如果如您对该问题的评论所述,您有一个以印地语或旁遮普语命名的Access数据库,那么使用Java Access数据库的两种最常见的"直接"方法将不适用:

(1)JDBC-ODBC桥

这是你一直在尝试使用的。不幸的是,当数据库包含包含代码点U+007F以上字符的Unicode文本时,JDBC-ODBC桥从未与Access ODBC驱动程序一起正常工作。对于文本数据和表/列名称都是如此。此外,JDBC-ODBC桥已过时:它已从Java 8中删除,不受支持。因此,这种选择是一条死胡同。

(2)UCanAccess

UCanAccess可以成功读取/写入Unicode文本数据,但当前(2.x)版本无法使用包含代码点U+007F以上Unicode字符的元数据(表/列名)。计划在UCanAccess(3.x)的下一个主要版本中支持表/列名中的这些字符,但尚未宣布发布的时间表。

其他选项:

根据您需要操作的限制条件,您可能会考虑以下一种或多种解决方案。

  • 您可以将Access数据库中的数据移动到另一个数据库中,该数据库的JDBC驱动程序支持印地语和旁遮普语的元数据。

  • 您可以用C#而不是Java构建应用程序。(Visual Studio 2013社区版免费提供。)

  • 如果真的必须坚持使用Java,并且您的数据必须保留在Access数据库中,那么您可以安装Microsoft SQL Server Express Edition,在SQL Server中创建一个指向Access数据库的"链接服务器"(详细信息请参阅此处),然后使用SQL Server的JDBC驱动程序对Access数据库运行查询。

最新更新