我需要在Oracle中插入希腊字符,例如'φ'。我现有的数据库结构不支持它。在调查发现各种解决方案时,我采用了使用NCLOB而不是CLOB的解决方案。当我使用unicode,03A6代表'φ'时,它工作得非常好,并且在SQL编辑器中使用UNISTR函数来插入。如下所示。
UPDATE配置设置CLOB = UNISTR('\ 03A6')
然而,当我尝试使用hibernate通过我的应用程序插入字符时,它失败了。在调试时,我发现插入前的字符串是'\ u03A6'。插入后,我将其视为¿。
有人可以帮我解决这个问题吗?我如何使用UNISTR?
PN:我不使用任何原生sqls或hqls。我使用表的实体对象。
修改
使用的Hibernate版本是3.5.6。无法更改版本,因为有很多其他依赖于此的插件。因此,不能在Hibernate Entity中的字段上使用 @Nationalized 或 @Type(type =“org.hibernate.type.NClobType”)
答案 0 :(得分:0)
在对不同的文章绞尽脑汁并尝试了很多选项后,我终于决定稍微调整一下我的代码来处理这个问题,而不是通过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字符,但效果很好。