Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Неправильное отображение кирилицы в CLOB  [new]
holyguest
Member

Откуда: Из облака
Сообщений: 70
Добрый день!
Есть у клиента сервер Oracle 12.2.0.1 на Oracle Linux 7.
NLS_DATABASE_PARAMETERS
+
Картинка с другого сайта.

(если вдруг проблема с картинкой, то
NLS_LANGUAGE=AMERICAN
NLS_TERRITORY=AMERICA
NLS_CHARACTERSET=CL8MSWIN1251
NLS_NCHAR_CHARACTERSET=AL16UTF16
)
С компьютера на Windows (что Windows Server 2012 R2, что Windows 10) выполняем выборку данных из поля (CLOB) с кирилицей (Oracle SQL Developer) и получаем явно не то, что хотели (квадратики, ромбики).
В приложении, работающем на Java (как и Oracle SQL Developer, по-моему) та же проблема.
Данные с кирилицей в полях VARCHAR, NVARCHAR отображаются корректно.
Выполняем этот же запрос через SQL*Plus непосредственно на сервере Linux — все в порядке.
Пробовали следующее:
  • На компьютерах с Windows переменную среды NLS_LANG уже выставляли по-разному(RUSSIAN_RUSSIA.CL8MSWIN1251, AMERICAN_AMERICA.CL8MSWIN1251, ENGLISH_AMERICA.CL8MSWIN1251). Совсем убирали тоже.
  • Аналогично игрались с параметром реестра HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_OraClient12g_home1\NLS_LANG
  • В переменные среды прописывали JAVA_ARGS=-Duser.country=en -Duser.language=US для смены дефолтной локали в JVM (начитались всякого здесь и тут).
  • Пробовали в свойствах SQL Developera прописывать
    AddVMOption -Duser.country=en
    AddVMOption -Duser.language=US

    без результата.
  • Пробовали через SQL Developer изменять параметры сессии:
    alter session set NLS_LANGUAGE=RUSSIAN(или AMERICAN);
    alter session set NLS_TERRITORY=RUSSIA(или AMERICA);
    

    Все манипуляции не дали результата. По-прежнему проблемы с кодировкой на клиентах Windows.
    Я просмотрел форумы и интернет прежде чем писать пост, но случая, похожего на этот, не нашёл.

    На сколько я понимаю, CLOB хранит данных в кодировке, указанной в NLS_CHARACTERSET=CL8MSWIN1251 (как и поля VARCHAR) и в данном случае проблем быть не должно. В параметрах NLS_LANG везде где указавали мы выставляли кодировку именно CL8MSWIN1251, как и на сервере. Разве что меняли локаль. если есть какие-нибудь идеи, то буду благодарен за совет, вектор куда копать.

    Если бы здесь убивали за тупые вопросы, я бы сдох в первый же день
  • 9 июн 17, 13:02    [20552931]     Ответить | Цитировать Сообщить модератору
     Re: Неправильное отображение кирилицы в CLOB  [new]
    Dimitry Sibiryakov
    Member

    Откуда:
    Сообщений: 51771

    holyguest
    Выполняем этот же запрос через SQL*Plus непосредственно на сервере Linux — все в порядке.

    А тот же запрос через SQL*Plus в консоли на клиенте Windows с предварительно выставленной
    chcp 1251?

    Posted via ActualForum NNTP Server 1.5

    9 июн 17, 13:09    [20552980]     Ответить | Цитировать Сообщить модератору
     Re: Неправильное отображение кирилицы в CLOB  [new]
    holyguest
    Member

    Откуда: Из облака
    Сообщений: 70
    Dimitry Sibiryakov,
    нет, обычный select (лично не имею доступа к серверу БД, но админ присылал скрины без предварительной установки кодировки)
    9 июн 17, 13:41    [20553145]     Ответить | Цитировать Сообщить модератору
     Re: Неправильное отображение кирилицы в CLOB  [new]
    holyguest
    Member

    Откуда: Из облака
    Сообщений: 70
    Dimitry Sibiryakov
    А тот же запрос через SQL*Plus в консоли на клиенте Windows с предварительно выставленной
    chcp 1251?

    Ой, глупость написал.
    Не пробовали из под Windows на SQL*Plus (админ заходил на сервер БД по ssh(Putty) и там в консоли выполнял запрос).
    НО, из под Windows PL\SQL Developer возвращает читаемую кирилицу в качестве результата обычного select'a все того же CLOB-поля.
    9 июн 17, 13:50    [20553175]     Ответить | Цитировать Сообщить модератору
     Re: Неправильное отображение кирилицы в CLOB  [new]
    altjke
    Member

    Откуда:
    Сообщений: 102
    holyguest,

    Поднимал тот же вопрос недавно
    https://www.sql.ru/forum/1262328/nekorrektno-otobrazhaetsya-chast-russkih-slov


    Какая у тебя версия Java там где кириллица кривая?
    9 июн 17, 13:58    [20553197]     Ответить | Цитировать Сообщить модератору
     Re: Неправильное отображение кирилицы в CLOB  [new]
    holyguest
    Member

    Откуда: Из облака
    Сообщений: 70
    altjke
    Какая у тебя версия Java там где кириллица кривая?

    1.8.0.121

    Ещё небольшое дополнение: есть системы, где это все работает нормально (и приложение на Java, и SQL Developer). Все БД создаются с NLS_CHARACTERSET=CL8MSWIN1251 и NLS_NCHAR_CHARACTERSET=AL16UTF16.

    Отличие конкретно этой системы: Oracle 12 (в большинстве случаев 11g), Java 8 (в остальных — 7 и 6).
    Это вряд ли имеет большое значение именно в данном вопросе, но написать стоит.
    9 июн 17, 14:20    [20553261]     Ответить | Цитировать Сообщить модератору
     Re: Неправильное отображение кирилицы в CLOB  [new]
    altjke
    Member

    Откуда:
    Сообщений: 102
    holyguest
    altjke
    Какая у тебя версия Java там где кириллица кривая?

    1.8.0.121

    Ещё небольшое дополнение: есть системы, где это все работает нормально (и приложение на Java, и SQL Developer). Все БД создаются с NLS_CHARACTERSET=CL8MSWIN1251 и NLS_NCHAR_CHARACTERSET=AL16UTF16.

    Отличие конкретно этой системы: Oracle 12 (в большинстве случаев 11g), Java 8 (в остальных — 7 и 6).
    Это вряд ли имеет большое значение именно в данном вопросе, но написать стоит.


    Извиняюсь, больше интересует версия Java на клиенте,а не на сервере.
    9 июн 17, 14:44    [20553344]     Ответить | Цитировать Сообщить модератору
     Re: Неправильное отображение кирилицы в CLOB  [new]
    NLS_LANG
    Guest
    holyguest,
    Проверьте в соединении, в котором получаете искажение, фактически установленное значение кодировки клиента.
    Select c.Client_Charset
      From Gv$session s
      Join Gv$session_Connect_Info c
        On c.Inst_Id = s.Inst_Id
       And c.Sid = s.Sid
       And c.Serial# = s.Serial#
     Where s.Audsid = Userenv('sessionid');
    

    Было дело нарывался на то, что инструмент не воспринимал системные установки NLS_LANG, перебивая ее значение собственным устанавливаемым значением переменных среды (PL/SQL Developer 11 on Win32, принимал только если значение NLS_LANG передать как опцию запуска в командной строке).
    12 июн 17, 15:38    [20558143]     Ответить | Цитировать Сообщить модератору
    Все форумы / Oracle Ответить