1

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

?我在字符应该出现的位置收到问号 ( )。为什么是这样?

4

4 回答 4

1

当 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
}
于 2014-09-18T13:22:26.217 回答
0

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

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

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

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

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

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

于 2014-01-07T21:25:08.893 回答
0

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

希望这个对你有帮助。

于 2013-10-05T05:49:35.073 回答
0

不是“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);
于 2017-08-17T14:52:23.170 回答