2

我有数据库,其中一些名称是用立陶宛字母写的,但是当我尝试使用 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。

4

3 回答 3

4

既然 JDBC-ODBC 桥已从 Java 8 中删除,这个特定的问题将越来越成为一个历史性的问题,但要记录在案:

对于高于代码点 U+00FF 的 Unicode 字符,JDBC-ODBC 桥从未与 Access ODBC 驱动程序(“Jet”和“ACE”)一起正常工作。这是因为 Access 将此类字符存储为 Unicode,但它使用 UTF-8 编码。相反,它使用 UTF-16LE 的“压缩”变体,其中代码点为 U+00FF 及以下的字符存储为单个字节,而 U+00FF 以上的字符存储为空字节,后跟它们的 UTF-16LE 字节对(s)。

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

访问编码.png

然后将其存储为

I  m  o  n  ė
-- -- -- -- --------
49 6D 6F 6E 00 17 01

('ė' 是 U+0117)。

JDBC-ODBC 桥不理解它从 Access ODBC 驱动程序接收到的那个最后一个字符,所以它只是返回

Imon?

另一方面,如果我们尝试使用 UTF-8 编码将字符串存储在 Access 数据库中,如果 JDBC-ODBC 桥尝试插入字符串本身就会发生这种情况

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 中的“破折号”,即 U+2014,因此它存储为00 14 20

现在 JDBC-ODBC 桥可以正常检索它(因为 Access ODBC 驱动程序在退出时将字符“还原”回C4 97),但是如果我们在 Access 中打开数据库,我们会看到

ImonÄ—

utf8Encoded.png

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

对于没有 ODBC 的 Access 数据库的完整 Unicode 字符支持,请考虑改用UCanAccess。(更多详细信息可在此处的另一个问题中找到。)

于 2014-04-01T12:25:26.610 回答
0

当您使用 JDBC-ODBC 桥时,您可以在 connection details 中指定一个字符集

试试这个:

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

String baza="jdbc:odbc:DatabaseDC"; 
connect=DriverManager.getConnection(baza, prop);
于 2011-08-28T17:57:27.367 回答
0

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

java.util.Properties prop = new java.util.Properties();
prop.put("charSet", "Windows-1257");
于 2014-04-01T08:25:38.247 回答