通过 JDBC-ODBC 从 Access 数据库中读取 Unicode 字符



我的 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");
}

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

当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
}

我希望您的 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 表,以确保从数据库读取时信息已丢失。

希望这有所帮助。

它不是"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);
这是Access ODBC

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

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

2005 年 11 月向 Sun 提交了一份错误报告,概述了该问题。该报告于2013年4月以"无法修复"的形式关闭,并附有评论

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

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

在没有 ODBC 的情况下从 Java 操作 Access 数据库

最新更新