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

时间:2011-08-28 17:10:27

标签: java ms-access jdbc character-encoding jdbc-odbc

我有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。

3 个答案:

答案 0 :(得分:3)

现在已经从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字节对(一个或多个)。

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

accessEncoded.png

然后将其存储为

I  m  o  n  ė
-- -- -- -- --------
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  m  o  n  ė
-- -- -- -- -----
49 6D 6F 6E C4 97

然后Access ODBC驱动程序将它作为

存储在数据库中
I  m  o  n  Ä  —
-- -- -- -- -- ---------
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 Driver“在出路时”将字符“反转”回C4 97),但是如果我们在Access中打开数据库,我们会看到< / p>

ImonÄ—

utf8Encoded.png

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

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

答案 1 :(得分:0)

当您使用JDBC-ODBC桥时,you can specify a charset in the connection details

试试这个:

Properties prop = new java.util.Properties();
prop.put("charSet", "UTF-8");

String baza="jdbc:odbc:DatabaseDC"; 
connect=DriverManager.getConnection(baza, prop);

答案 2 :(得分:0)

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

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