powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Неявное преобразование getClobVal [UTF8 -> WINDOWS-1251]
5 сообщений из 5, страница 1 из 1
Неявное преобразование getClobVal [UTF8 -> WINDOWS-1251]
    #40063875
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересное неявное преобразование обнаружил.

В этом запросе, я попытался воспроизвести жизненный цикл одной XML.
Она, путешествуя по разным местам кода, несколько раз преобразовывается,
и, в конечном итоге, оказывается непригодной для работы.

Oracle 12c - 12.2.0.1.0 64 bit

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select
         t.msg x1, -- исходная XML
         t.msg.getClobVal() x2, -- получаем CLOB от XML
         t.msg.getBlobVal(NLS_CHARSET_ID('UTF8')) x3, -- получаем BLOB от XML
 xmltype(t.msg.getBlobVal(NLS_CHARSET_ID('UTF8')),NLS_CHARSET_ID('UTF8')) x4, -- снова получаем XML из блоба, полученного от XML
 xmltype(t.msg.getBlobVal(NLS_CHARSET_ID('UTF8')),NLS_CHARSET_ID('UTF8')).getClobVal()  x5 -- получаем CLOB от восстановленной из блоба XML
from
(
 select xmltype('<?xml version="1.0" encoding="UTF-8"?><x><y></y></x>') msg from dual
)t


В результате, получаем:
в полях x1 - x3
Код: xml
1.
<?xml version="1.0" encoding="UTF-8"?>...


в полях x4,x5 ( Интересно, почему?)
Код: xml
1.
<?xml version="1.0" encoding="WINDOWS-1251"?>...


Возможно, дело в этом:
Код: plsql
1.
2.
 select SYS_CONTEXT ('USERENV', 'LANGUAGE') from dual;
 -- RUSSIAN_RUSSIA.CL8MSWIN1251


На машинах, на которых SYS_CONTEXT ('USERENV', 'LANGUAGE') выдает AMERICAN_AMERICA.AL32UTF8
- не происходит подмена кодировки.

Но, может, я и ошибаюсь насчет причин, и дело в чем-то другом?
В любом случае, мне не кажется такое преобразование нормальным поведением.

Кстати, у меня x4 превращается в WINDOWS-1251 только в PL/SQL Developer ( видимо, настройки сессии отличаются от настройки в других программах)
А вот x5 - превращается в WINDOWS-1251 - во всех трех программах Oracle SQL Developer / DBForge / PL/SQL Developer

Интересно так же то, что в x3,x4,x5
оказывается перезаписана структура XML - заменена конструкция
Код: xml
1.
<y></y>

на один самозакрытый тег
Код: xml
1.
<y/>

.
Видимо, это говорит о том, что оракловый движек не просто работает с байтами тела XML, а полностью парсит, разбирает и собирает заново XML.
И, в какой-то момент, он "забывает" какой XMLROOT нужно использовать.
...
Рейтинг: 0 / 0
Неявное преобразование getClobVal [UTF8 -> WINDOWS-1251]
    #40063881
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ART-CODE,

CLOB - это текстовая строка, ты же сохраняя строку в базе, хочешь, чтобы другие пользователи с другим nls_lang могли ее прочитать? Вот оракл и старается за тебя.
...
Рейтинг: 0 / 0
Неявное преобразование getClobVal [UTF8 -> WINDOWS-1251]
    #40063915
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sayan Malakshinov,

Спасибо, ясно.

Хуже всего то, что в этой XML вложена через CDATA другая XML, которая тоже в UTF8.
Просле таких преобразований, вложенная - становится поврежденной.
Внешняя XML "старается быть" в 1251, а внутренняя "хочет оставаться" в UTF8. :)
...
Рейтинг: 0 / 0
Неявное преобразование getClobVal [UTF8 -> WINDOWS-1251]
    #40063922
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ART-CODE
Sayan Malakshinov,

Спасибо, ясно.

Хуже всего то, что в этой XML вложена через CDATA другая XML, которая тоже в UTF8.
Просле таких преобразований, вложенная - становится поврежденной.
Внешняя XML "старается быть" в 1251, а внутренняя "хочет оставаться" в UTF8. :)
не надо работать с xmltype через getclobval/getblobval.
...
Рейтинг: 0 / 0
Неявное преобразование getClobVal [UTF8 -> WINDOWS-1251]
    #40063945
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sayan Malakshinov
не надо работать с xmltype через getclobval/getblobval.

Есть поля CLOB и BLOB в таблицах, в которые эту XML нужно сохранить.
Как получить эти типы из xmltype без использования getclobval/getblobval - на эту тему еще придется "изобретать велосипед".

Менять "чужую" архитектуру, и делать в таблицах поля с типом данных xmltype, нет возможности.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Неявное преобразование getClobVal [UTF8 -> WINDOWS-1251]
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]