Как знак евро хранится в поле CLOB в Oracle (набор символов AL32UTF8)?

Я использую веб-приложение, которое работает в WebSphere и взаимодействует с базой данных Oracle (используя набор символов AL32UTF8).

Если я использую веб-приложение для ввода текста, а затем нажимаю кнопку «Сохранить», я ожидаю, что текст будет сохранен в поле CLOB в базе данных Oracle. В веб-приложении есть функциональные возможности для просмотра текста путем извлечения его из базы данных.

Когда я ввожу текст, содержащий знак евро (€), нажимаю кнопку «Сохранить» и просматриваю текст с помощью веб-приложения, я обнаружил, что знак евро был преобразован в «?».

Я пытаюсь найти, поврежден ли текст в базе данных.

  1. Хранится ли знак евро как «0xE2 0x82 0xAC» (3 байта) в Oracle?

  2. Если это так, есть ли запрос к базе данных, который может это подтвердить? (Допустим, таблица называется SOME_TABLE, а поле CLOB называется SOME_FIELD.)

Большое Вам спасибо.


person Andy    schedule 04.07.2012    source источник


Ответы (1)


Он хранится так же, как varchar2, и выглядит как 3 байта. Вы можете использовать dump функцию, чтобы он хранится, хотя с clob вам нужно будет извлечь соответствующие символы (в данном случае это 3 байта), например с dbms_lob.substr. Это из 11gR2 в Linux:

create table t42 (x clob, y varchar2(10));

insert into t42(x, y) values ('€','€');

select dump(dbms_lob.substr(x,3,1)) from t42;

DUMP(DBMS_LOB.SUBSTR(X,3,1))
--------------------------------------------------------------------------------
Typ=1 Len=6: 195,162,194,130,194,172

select dump(y) from t42;

DUMP(Y)
--------------------------------------------------------------------------------
Typ=1 Len=6: 195,162,194,130,194,172

Или в шестнадцатеричном формате:

select dump(dbms_lob.substr(x,3,1),16) from t42;

DUMP(DBMS_LOB.SUBSTR(X,3,1),16)
--------------------------------------------------------------------------------
Typ=1 Len=6: c3,a2,c2,82,c2,ac
person Alex Poole    schedule 04.07.2012