我的 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);
驱动程序和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 数据库