现在 JDBC-ODBC 桥已从 Java 8 中删除,这个特定问题将越来越成为一个历史兴趣项目,但需要记录一下:
对于代码点 U+00FF 以上的 Unicode 字符,JDBC-ODBC 桥从未与 Access ODBC 驱动程序(“Jet”和“ACE”)正确配合使用。这是因为 Access 存储的是 Unicode 等字符,但它does not使用UTF-8编码。相反,它使用 UTF-16LE 的“压缩”变体,其中代码点 U+00FF 及以下的字符存储为单个字节,而 U+00FF 以上的字符存储为空字节,后跟其 UTF-16LE 字节对(s)。
如果字符串“Imonė”存储在 Access 数据库中,以便它在 Access 本身中正确显示
然后它被存储为
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 中是“em dash”,即 U+2014,因此它存储为
00 14 20
现在 JDBC-ODBC 桥可以正常检索它(因为 Access ODBC 驱动程序将字符“un-mangles”回)C4 97
在出去的路上),但是如果我们在 Access 中打开数据库,我们会看到
ImonÄ—
JDBC-ODBC 桥从来没有 and 永不能够为 Access 数据库提供完整的本机 Unicode 支持。向 JDBC 连接添加各种属性will not解决这个问题。
要在没有 ODBC 的情况下对 Access 数据库提供完整的 Unicode 字符支持,请考虑使用UCanAccess http://ucanaccess.sourceforge.net/site.html反而。 (更多详细信息可在另一个问题中找到here https://stackoverflow.com/q/21955256/2144390.)