【发布时间】: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