我的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");
}我在字符应该在的位置收到问号(?)。为什么会这样呢?
发布于 2014-09-18 21:22:26
当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
}发布于 2013-10-05 13:49:35
我希望您的JDBC驱动程序能够透明地处理对数据库的字符读取和写入。Java的内部字符串表示是UTF-16。
Java(UTF-16) --JDBC--> Database(DbEncoding)
Database(DbEncoding) --JDBC--> Java(UTF-16) 也许问题是您试图使用UTF8强制读取它们,而数据库使用了另一种内部表示?
另外,你如何验证你收到了“?”
如果涉及System.out,您应该考虑到此PrintStream将内存中的字符串转换为它使用的字符集。IIRC这个字符集可以通过Charset.defaultcharset()找到,它是运行程序的JVM的一个属性。
最好检查字符的十六进制值并查找Unicode表,以确保在从数据库读取时信息已丢失。
希望这能对你有所帮助。
发布于 2014-01-08 05:25:09
这是Access ODBC驱动程序和JDBC-ODBC桥之间长期存在的互操作性问题。Access使用UTF-16LE编码的变体(而不是UTF-8)存储Unicode字符,JDBC-ODBC桥无法检索它们。
(请注意,这不是Access ODBC驱动程序本身的问题,因为其他工具,如Python,可以正确地检索pyodbc字符。这是JDBC-ODBC桥和Access ODBC驱动程序之间的兼容性问题。)
2005年11月,Sun提交了一份bug report,概述了这个问题。该报告在2013年4月被关闭为“with‘t Fix”,并发表了以下评论
桥已从Java 8中删除,不受支持
如果需要在Access数据库中使用任意Unicode字符,则应考虑使用UCanAccess。有关详细信息,请参阅
https://stackoverflow.com/questions/19192750
复制相似问题