Java无法通过JDBC-ODBC从Access检索Unicode(立陶宛语)字母

我有DB,其中一些名字是用立陶宛字母写的,但是当我试图用java创建它时,它会忽略立陶宛字母

DbConnection(); zadanie=connect.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); sql="SELECT * FROM Clients;"; dane=zadanie.executeQuery(sql); String kas="Imonė"; while(dane.next()) { String var=dane.getString("Pavadinimas"); if (var!= null) {var =var.trim();} String rus =dane.getString("Rusys"); System.out.println(kas+" "+rus); } void DbConnection() throws SQLException { String baza="jdbc:odbc:DatabaseDC"; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); }catch(Exception e){System.out.println("Connection error");} connect=DriverManager.getConnection(baza); } 

在DB类型的字段中是TEXT,大小为20,不要使用任何额外的字母解码或类似的东西。

它给了我“ImonėImone”尽管在DB中写的是“Imonė”,它等于rus。

在使用JDBC-ODBC桥时, 可以在连接详细信息中指定charset 。

尝试这个:

 Properties prop = new java.util.Properties(); prop.put("charSet", "UTF-8"); String baza="jdbc:odbc:DatabaseDC"; connect=DriverManager.getConnection(baza, prop); 

现在已经从Java 8中删除了JDBC-ODBC Bridge,这个特定问题将越来越多地成为历史感兴趣的项目,但是对于记录:

对于代码点U + 00FF以上的Unicode字符,JDBC-ODBC Bridge从未正确使用Access ODBC驱动程序(“Jet”和“ACE”)。 这是因为Access存储Unicode等字符但使用UTF-8编码。 相反,它使用UTF-16LE的“压缩”变体,其中代码点U + 00FF及以下的字符存储为单个字节,而U + 00FF以上的字符存储为空字节,后跟其UTF-16LE字节对(S)。

如果字符串’Imonė’存储在Access数据库中,以便它在Access本身中正确显示

accessEncoded.png

然后它存储为

 I mon ė -- -- -- -- -------- 49 6D 6F 6E 00 17 01 

(’ė’是U + 0117)。

JDBC-ODBC Bridge无法理解从最终字符的Access ODBC驱动程序接收的内容,因此它只返回

 Imon? 

另一方面,如果我们尝试使用UTF-8编码将字符串存储在Access数据库中,就像JDBC-ODBC Bridge尝试插入字符串本身一样

 Statement s = con.createStatement(); s.executeUpdate("UPDATE vocabulary SET word='Imonė' WHERE ID=5"); 

该字符串将以UTF-8编码为

 I mon ė -- -- -- -- ----- 49 6D 6F 6E C4 97 

然后Access ODBC驱动程序将它存储在数据库中

 I mon Ä — -- -- -- -- -- --------- 49 6D 6F 6E C4 00 14 20 
  • C4是Windows-1252中的’Ä’,它是U + 00C4,因此它只存储为C4
  • 97是Windows-1252中的“em dash”,即U + 2014,因此它存储为00 14 20

现在JDBC-ODBC Bridge可以检索它好了(因为Access ODBC驱动程序“在解决方法时将字符”解除“回到C4 97 ),但是如果我们在Access中打开数据库,我们就会看到

 ImonÄ— 

utf8Encoded.png

JDBC-ODBC Bridge 从未 也永远无法为Access数据库提供完全本机Unicode支持。 向JDBC连接添加各种属性不会解决问题。

对于没有ODBC的Access数据库的完整Unicode字符支持,请考虑使用UCanAccess 。 (更多细节见另一个问题。)

尝试使用这个“Windows-1257”而不是UTF-8,这适用于波罗的海地区。

 java.util.Properties prop = new java.util.Properties(); prop.put("charSet", "Windows-1257");