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

2024-04-07

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 自定义按钮上的自定义属性不显示

    我扩展了 Button 小部件 使其能够应用多个自定义属性 其中一个属性是颜色滤镜 我在创建按钮时尝试将其应用于其背景 这是行不通的 请参阅下面的屏幕截图和代码 我尝试在同一代码位置直接设置背景颜色 它确实改变了背景颜色 但这不是我需要的
  • 将多个 DbContext 与通用存储库和工作单元结合使用

    我的应用程序变得越来越大 到目前为止我只有一个MyDbContext其中包含我的应用程序中所需的所有表格 我希望 为了概述 将它们分成多个DbContext like MainDbContext EstateModuleDbContext
  • gruntjs 加载外部配置

    嘿 咕噜大师们 我想将外部配置文件加载到 grunt 中 以便我可以执行以下操作 grunt dev homepage 它会加载homepage config json 然后运行watch grunt dev contact 它会加载con
  • Python 中 doxygen 风格文档字符串的 Vim 语法高亮显示

    我开始与doxygen生成我的 Python 代码的文档 我用doxypy过滤器来预处理 Python 文档字符串 我的目标是在 Python 中对 doxygen 注释进行良好的语法突出显示 当写我的mainpage在专用的 dox 文件
  • RewriteMap 激活

    如何在apache中激活RewriteMap 当我重新启动 apache 时 我尝试在 httpd 配置中运行 rewritemap 它说 此处不允许 RewriteMap 我尝试用谷歌搜索并访问apache 但找不到激活它的方法 有人知道
  • Bash 读取命令在循环外不起作用

    我一定错过了一些关于 Bash read 命令的非常基本的东西 在 shell 提示符下 无法将三个输入字段分配给相应的变量 echo a b c read x1 x2 x3 echo x1 x2 x3 这虽然有效 echo a b c w
  • Objective C sqlite3问题

    我发现在 iPhone 应用程序中更新 插入表格时遇到问题 因为我有一个文本列 当该文本包含 符号时 事情就会变得混乱 处理这个问题的最佳方法是什么 在使用带有撇号的字符串之前我应该 检查吗 有没有一种快速添加格式的方法 可以在每个撇号前面
  • actionPerformed 中的线程睡眠

    我正在尝试制作一个有 3 个按钮的小程序 所有按钮都是白色的 按下第一个按钮 带有文字 开始 将使第二个按钮变为橙色 3 秒钟 然后 在此时间之后 它将再次变为白色 而第三个按钮将永久变为绿色 然而 在我的下面的代码中 我在实现这一点时遇到
  • 将函数指针作为参数传递给 dll 函数并从 dll 内部调用它们是否安全?

    我想将一些 无论是否为 dll 函数指针作为参数传递给一些 dll 函数 并从 dll 内部调用它们 我想知道它是否安全 因为我找到了有关的信息http publib boulder ibm com infocenter zos v1r10
  • 如何在 iOS Swift 4 中检测屏幕锁定/解锁?

    如何在 iOS 中检测屏幕锁定 解锁 我正在使用 Swift 4 Xcode 9 2 并且我尝试过以下链接 但它们对我不起作用 iOS swift 3 检测到屏幕解锁失败 https stackoverflow com questions
  • C99 指定初始化程序重复索引在构建输出或 lint 中根本未标记

    前几天我玩了一下指定的初始化器 令我惊讶的是 多次使用相同的索引是有效的 更重要的是 当我这样做时 它甚至没有产生编译器警告 错误 甚至信息语句 甚至 PC Lint 似乎也不关心 我认为这最让我惊讶 我想知道在这种情况下编译器是否有原因甚
  • 对强连通图的最小添加

    我有一组节点和它们之间的一组有向边 边缘没有重量 如何找到必须添加的最小数量的边以使图强连接 即应该有一条从每个节点到所有其他节点的路径 这个问题有名字吗 这是一个非常经典的图问题 运行类似 Tarjan SCC 算法的算法来查找所有 SC
  • 两条线之间的角度错误

    我想得到两条线之间的角度 所以我使用了这段代码 int posX ScreenWidth gt gt 1 int posY ScreenHeight gt gt 1 double radians degrees radians atan2f
  • 用python计算梯度

    我想知道如何numpy gradient工作 我用梯度来尝试计算群速度 波包的群速度是频率相对于波数的导数 而不是一组速度 我向它提供了一个 3 列数组 前 2 列是 x 和 y 坐标 第三列是该点 x y 的频率 我需要计算梯度 我确实期
  • Git 致命:远程端挂起

    所以我以为我终于在 Windows 上完成了所有设置 然后遇到了这个问题 当前设置 网址 ssh user host port myapp git 已经运行 Putty 并且可以通过 ssh authorized keys 直接使用有效的
  • Firebase 如何处理长整型和双精度型?

    Firebase Java API 指定 Long 是传递给 setValue 的有效类型 JavaScript 只支持单一数字类型 相当于 Java 的 double 因此 如果我从 JavaScript 插入一个数字并稍后从 Java
  • 我可以在应用程序运行时以编程方式翻转 Info.plist 值吗?

    我有兴趣使用SBUsesNetwork and UIRequiresPersistentWiFi我的应用程序中的密钥 但是 我想仅在使用一组特定的视图控制器时启用它们 有没有办法在应用程序运行时以编程方式翻转这些键值 您无法在运行时修改捆绑
  • Boost Python 没有 to_python for std::unique_ptr

    我有一个无法解决的 boost python 问题 我试图公开一个包含返回函数的类std unique ptr 签名看起来像 std unique ptr
  • 在 pygame 物理模拟中添加 wxPython GUI 元素

    我做了一个pygame物理模拟 抛射运动 但它缺乏交互性 比如接受发射角度 速度等 我想添加带有增加 减少箭头的输入框 但不知道如何去做 谢谢您的帮助 也许你可以尝试PGU http www pygame org project 108 菲
  • Java 无法通过 JDBC-ODBC 从 Access 检索 Unicode(立陶宛语)字母

    我有数据库 其中一些名称是用立陶宛字母写的 但是当我尝试使用 java 获取它们时 它会忽略立陶宛字母 DbConnection zadanie connect createStatement ResultSet TYPE SCROLL I