【问题标题】:Reading Unicode characters from an Access database via JDBC-ODBC通过 JDBC-ODBC 从 Access 数据库中读取 Unicode 字符
【发布时间】:2013-10-12 03:10:33
【问题描述】:

我的 Access 2010 数据库中有一些非标准字符。当我通过

阅读它们时
Connection con = null;
try{
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    java.util.Properties prop = new java.util.Properties();
    prop.put("charSet", "UTF8");
    String database = "jdbc:odbc:Lb";
    con = DriverManager.getConnection(database, prop);
} catch (Exception ex) {
    System.out.println("Error");
}
Statement stm = conn.createStatement();
ResultSet rs = stm.executeQuery("SELECT distinct forename, surname from PSN where isValid");

while (rs.next()) {
    String forename = rs.getString("forename");
}

我收到问号 (?) 字符应该在哪里。这是为什么呢?

【问题讨论】:

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


【解决方案1】:

我希望您的 JDBC 驱动程序能够透明地处理读取和写入数据库的字符。 Java 的内部字符串表示是 UTF-16。

Java(UTF-16)         --JDBC--> Database(DbEncoding)
Database(DbEncoding) --JDBC--> Java(UTF-16) 

也许问题是您试图用 UTF8 强制读取它们,而数据库使用另一种内部表示?

另外,你如何验证你收到'?'

如果涉及 System.out,您应该考虑到此 PrintStream 将内存中的字符串转换为它使用的字符集。 IIRC 这个字符集可以通过 Charset.defaultcharset() 找到,它是运行程序的 JVM 的一个属性。

最好检查 char 的十六进制值并查找 Unicode 表,以确保在从数据库读取时信息已丢失。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    这是 Access ODBC 驱动程序和 JDBC-ODBC 桥之间长期存在的互操作性问题。 Access 使用 UTF-16LE 编码的变体(不是 UTF-8)存储 Unicode 字符,而 JDBC-ODBC 桥无法检索它们。

    (请注意,这不是 Access ODBC 驱动程序的问题本身,因为其他工具(如 Python 的 pyodbc)可以正确检索 Unicode 字符。这是 JDBC- ODBC 桥和 Access ODBC 驱动程序。)

    bug report 于 2005 年 11 月提交给 Sun,概述了该问题。该报告于 2013 年 4 月以“不会修复”的形式结束,并附有评论

    桥已从 Java SE 8 中删除,不受支持

    如果您需要在 Access 数据库中使用任意 Unicode 字符,您应该考虑使用UCanAccess。有关详细信息,请参阅

    Manipulating an Access database from Java without ODBC

    【讨论】:

      【解决方案3】:

      当 DB 包含波兰字符时,我有问号。当我将字符编码设置为 windows-1250 时,它已修复。

      def establish(dbFile: File): Connection = {
        val fileName = dbFile.getAbsolutePath
        val database = s"${driver}DBQ=${fileName.trim};DriverID=22;READONLY=true}"
        val props = new Properties()
        props.put("charSet", "Cp1250")
        val connection= DriverManager.getConnection(database,props)
        connection
      }
      

      【讨论】:

        【解决方案4】:

        不是“utf8”、“Cp1250”!

        必须使用:ISO-8859-1

        java.util.Properties prop = new java.util.Properties();
        prop.put("charSet", "ISO-8859-1");
        String connURL = "jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + accessFileName + ";uid=''; pwd='';";    
        sql = "SELECT * FROM enq_horaires;";'
        con = DriverManager.getConnection(connURL, prop);
        stmt = con.createStatement();
        ResultSet rset = stmt.executeQuery(sql);
        

        【讨论】:

          猜你喜欢
          • 2010-11-30
          • 1970-01-01
          • 2010-12-22
          • 2012-12-17
          • 2010-11-27
          • 2023-04-10
          • 2011-08-16
          • 2020-01-13
          • 2018-09-13
          相关资源
          最近更新 更多