2017-01-13 12 views
0

У меня есть требование вставить греческие символы, такие как 'φ', в Oracle. Моя существующая структура БД не поддерживала его. При исследовании нашли различные решения, и я принял решение использовать NCLOB вместо CLOB. Он отлично работает, когда я использую unicode, 03A6, для 'φ' и использую функцию UNISTR в редакторе SQL для вставки. Как и ниже.Hibernate Вставить греческие символы в Oracle

UPDATE конфигурации множество CLOB = UNISTR ('\ 03A6')

Однако она не при попытке вставить символ через мое приложение, используя спящий режим. При отладке я обнаружил, что строка перед вставкой - '\ u03A6'. После вставки я вижу его как ¿.

Может кто-нибудь, пожалуйста, помогите мне, как я могу это решить? Как я могу использовать UNISTR?

PN: Я не использую никаких родных sqls или hqls. Я использую объект объекта таблицы.

Edit:

Hibernate версия используется 3.5.6. Невозможно изменить версию, так как в ней так много других плагинов. Таким образом, не может использовать @Nationalized или @type (тип = «org.hibernate.type.NClobType») на моем поле в спящем Entity

+0

Возможно, символ сохранен правильно в базе данных, но он не отображается правильно на вашем экране (поскольку ваш сеанс, а не база данных, использует набор символов, который не поддерживает греческие буквы). Чтобы узнать, что хранится, вы можете использовать функцию DUMP. Например, 'select UNISTR ('\ 03A6'), dump (UNISTR ('\ 03A6')) из double' показывает мне букву φ (потому что мой набор символов моего интерфейса поддерживает ее) и' Typ = 1 Len = 2 : 3,166' - описание двухбайтового символа Юникода. Используйте функцию DUMP для проверки правильности сохранения символа в базе данных. – mathguy

+0

Не совсем. Я вижу ¿, хранящийся в БД. – Maz

+0

Не уверен, что вы имеете в виду. База данных не хранит странные символы, она хранит только байты (нули и единицы). Они интерпретируются как любые символы вашего front-end, независимо от того, что вы используете. Вы никогда не увидите литерала, хранящегося в БД. Вы попробовали то, что я предложил? Это займет несколько секунд. – mathguy

ответ

0

После стеллажами мой мозг на различных статьях и пытается так много вариантов, я наконец решил немного изменить мой код, чтобы справиться с этим в Java, а не через спящий режим или Oracle DB.

Прежде чем вставлять в БД, я идентифицирую символы в кодировке Unicode в строке и отформатирую ее для добавления &#x в начале и ; в конце. Эта закодированная строка будет отображаться с ее фактическим юникодом в пользовательском интерфейсе (JSP, HTML), совместимом с UTF-8. Ниже приведен код.

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";

Эта строка при визуализации в пользовательском интерфейсе (и даже в Word Doc) он отображает его как

ABC  DEF GHI

Я пробовал его с различными символами юникода, и он отлично работает.