【问题标题】:Hibernate Insert Greek Characters into OracleHibernate 将希腊字符插入 Oracle
【发布时间】:2017-01-13 00:36:15
【问题描述】:

我需要在 Oracle 中插入希腊字符,例如“φ”。我现有的数据库结构不支持它。在调查中发现了各种解决方案,我采用了使用 NCLOB 而不是 CLOB 的解决方案。当我将 unicode 03A6 用于“φ”并在 SQL 编辑器中使用 UNISTR 函数进行插入时,它工作得非常好。就像下面的一样。

更新配置集 CLOB = UNISTR('\03A6')

但是,当我尝试使用 hibernate 通过我的应用程序插入字符时,它失败了。在调试时,我发现插入之前的字符串是'\u03A6'。插入后,我将其视为 ¿。

有人可以帮我解决这个问题吗?如何使用 UNISTR?

PN:我不使用任何本机 sqls 或 hqls。我使用表的实体对象。

编辑:

使用的休眠版本是 3.5.6。无法更改版本,因为有很多其他插件依赖于此。因此,不能在 Hibernate Entity 中的字段上使用 @Nationalized@Type(type="org.hibernate.type.NClobType")

【问题讨论】:

  • 字符可能已正确存储在数据库中,但无法正确显示在屏幕上(因为您的会话,而不是数据库,使用不支持希腊字母的字符集)。要找出存储的内容,您可以使用 DUMP 功能。例如,select UNISTR('\03A6'), dump(UNISTR('\03A6')) from dual 显示字母 φ(因为我的前端字符集支持它)和 Typ=1 Len=2: 3,166 - 一个两字节 Unicode 字符的描述。使用DUMP函数查看字符是否正确存储在数据库中。
  • 并非如此。我可以看到 ¿ 存储在数据库中。
  • 不确定你的意思。数据库不存储奇怪的符号,它只存储字节(零和一)。无论您使用什么,它们都会被您的前端解释为任何符号。您永远看不到存储在数据库中的文字 ¿。你试过我的建议了吗?应该需要几秒钟。
  • 是的。我尝试了 UNISTR 查询,得到的结果与您的相同,即 Φ 和 Typ=1 Len=2: 3,166。是的,我可以在 SQL Developer 和 IntelliJ 编辑器的表格中看到 ¿。
  • OK - 你看 ¿ “in the table” 是正确的表达方式。这就是 SQL Developer 向您展示的内容。 “在数据库中”你有正确的字符(你用 DUMP 检查过)。下一个问题:您运行 SQL Developer 的机器上的操作系统是什么?

标签: oracle hibernate special-characters


【解决方案1】:

在对不同的文章绞尽脑汁并尝试了这么多选项之后,我最终决定稍微调整我的代码以在 Java 中而不是通过 hibernate 或 Oracle DB 来处理这个问题。

在插入数据库之前,我识别字符串中的 unicode 字符并将其格式化为在开头附加 &#x 并在末尾附加 ;。此编码字符串将在符合 UTF-8 的 UI(JSP、HTML)中与其实际 unicode 一起显示。下面是代码。

Formatter formatter = new Formatter();
    for (char c : text.toCharArray()) {
        if (CharUtils.isAscii(c)) {
            formatter.format("%c", c);
        } else {
            formatter.format("&#x%04x;", (int) c);
        }
    }

    String result = formatter.toString();

例如:

String test = "ABC \uf06c DEF \uf06cGHI";

将被格式化为

test = "ABC  DEF GHI";

这个字符串在 UI 中(甚至在 word doc 中)呈现时会显示为

ABC  DEF GHI

我尝试了各种 unicode 字符,效果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 2016-04-02
    • 2013-09-30
    • 2020-12-11
    • 1970-01-01
    相关资源
    最近更新 更多