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

Откуда:
Сообщений: 145
ORA 12.2 x64

В SQL Developer никаких проблем, корректно пишет и читает.
А вот SQL Assistant пишет в БД всё правильно (Developer'ом видно), а при чтении показывает всякую гадость, если символы юникодные. Например, символ цента (буква "c" с вертикальной чертой, на форуме неправильно показывается как "¢") Assistant читает как "Вў".

Пробовал клиентов x64 и x32 (соответственно и версии Assistant), результат одинаковый.

Куда копать? Это какие-то настройки Оракла или проблемы Assistant?
5 мар 19, 17:30    [21825622]     Ответить | Цитировать Сообщить модератору
 Re: Ломается кодировка при чтении данных из таблиц  [new]
Dimitry Sibiryakov
Member

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

Правильный Вася
Куда копать? Это какие-то настройки Оракла или проблемы Assistant?

Oracle Globalization Support Guide.

Не всё, что "видно правильно" на самом деле правильно. Надо аккуратно проверять байты на
соответствие кодировкам на всех этапах, включая хранение. Функция dump() тебе поможет.

Posted via ActualForum NNTP Server 1.5

5 мар 19, 17:36    [21825630]     Ответить | Цитировать Сообщить модератору
 Re: Ломается кодировка при чтении данных из таблиц  [new]
Vadim Lejnin
Member

Откуда:
Сообщений: 6574
Правильный Вася,

Возможно проблемы с фонтом, системными таблицами перекодировки

Начни с SQL.ru FAQ: CodePage, NLS_LANG: решение проблем с отображением сообщений на русском языке
5 мар 19, 17:42    [21825638]     Ответить | Цитировать Сообщить модератору
 Re: Ломается кодировка при чтении данных из таблиц  [new]
Правильный Вася
Member

Откуда:
Сообщений: 145
Смотрю по таблице символов для знака евро код 20AC.
А в developer запрос
SELECT dump('€',1016) from dual

возвращает
Typ=96 Len=3 CharacterSet=AL32UTF8: e2,82,ac

Как это понять?
5 мар 19, 18:13    [21825674]     Ответить | Цитировать Сообщить модератору
 Re: Ломается кодировка при чтении данных из таблиц  [new]
Vadim Lejnin
Member

Откуда:
Сообщений: 6574
Правильный Вася
Смотрю по таблице символов для знака евро код 20AC.
А в developer запрос
SELECT dump('€',1016) from dual

возвращает
Typ=96 Len=3 CharacterSet=AL32UTF8: e2,82,ac

Как это понять?

Вроде правильно, три байта:
Unicode Character 'EURO SIGN' (U+20AC)
5 мар 19, 18:30    [21825679]     Ответить | Цитировать Сообщить модератору
 Re: Ломается кодировка при чтении данных из таблиц  [new]
Dimitry Sibiryakov
Member

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

Правильный Вася
Как это понять?

Это значит, что тебе надо открывать для себя удивительный мир кодировок, включая UTF-8.

Posted via ActualForum NNTP Server 1.5

5 мар 19, 18:31    [21825680]     Ответить | Цитировать Сообщить модератору
 Re: Ломается кодировка при чтении данных из таблиц  [new]
Правильный Вася
Member

Откуда:
Сообщений: 145
Значит, в БД записывается правильно (из таблиц dump для евро те же коды показывает).

Тогда возвращаемся к первому посту: сохранение происходит верно, а вот чтение кривое.
Как такое может быть? Настройки ведь не меняю между ними.
5 мар 19, 19:15    [21825702]     Ответить | Цитировать Сообщить модератору
 Re: Ломается кодировка при чтении данных из таблиц  [new]
Vadim Lejnin
Member

Откуда:
Сообщений: 6574
Правильный Вася,

Скорее всего это не чтение кривое, это разные фонты
5 мар 19, 21:14    [21825760]     Ответить | Цитировать Сообщить модератору
 Re: Ломается кодировка при чтении данных из таблиц  [new]
Правильный Вася
Member

Откуда:
Сообщений: 145
Vadim Lejnin
Скорее всего это не чтение кривое, это разные фонты

Одна и та же программа, одно и то же окошко в ней.
Какие разные фонты? С какого перепуга?
5 мар 19, 22:00    [21825767]     Ответить | Цитировать Сообщить модератору
 Re: Ломается кодировка при чтении данных из таблиц  [new]
-2-
Member

Откуда:
Сообщений: 14420
Правильный Вася
Одна и та же программа, одно и то же окошко в ней.
И один и тот же символ. Может ты глазами поочередно мигаешь?
5 мар 19, 22:11    [21825771]     Ответить | Цитировать Сообщить модератору
 Re: Ломается кодировка при чтении данных из таблиц  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17146
Правильный Вася
ORA 12.2 x64

В SQL Developer никаких проблем, корректно пишет и читает.
А вот SQL Assistant пишет в БД всё правильно (Developer'ом видно), а при чтении показывает всякую гадость, если символы юникодные. Например, символ цента (буква "c" с вертикальной чертой, на форуме неправильно показывается как "¢") Assistant читает как "Вў".

Ошибка конфигурации клиента: NLS_LANG на клиенте установлен в .al32utf8, сам клиент (окошко) работает в локали (шрифтом) win1251.

Корректные варианты:
- объявить NLS_LANG .cl8mswin1251 - получите знак вопроса, поскольку 1251 не содержит "¢"
- объявить NLS_LANG .cl8mswin1252 - отработает "¢", но русские буквы (if any) станут вопросами
- переключить SQL Assistant на работу в UTF8.
6 мар 19, 00:22    [21825839]     Ответить | Цитировать Сообщить модератору
 Re: Ломается кодировка при чтении данных из таблиц  [new]
Правильный Вася
Member

Откуда:
Сообщений: 145
andrey_anonymous
NLS_LANG на клиенте установлен в .al32utf8

Запрос
SELECT * FROM v$parameter WHERE NAME LIKE 'nls%'

дает RUSSIAN, причем одинаково и в SQL Developer, и в SQL Assistant
7 мар 19, 23:05    [21827789]     Ответить | Цитировать Сообщить модератору
 Re: Ломается кодировка при чтении данных из таблиц  [new]
Правильный Вася
Member

Откуда:
Сообщений: 145
И в реестре стоит
NLS_LANG=RUSSIAN_RUSSIA.CL8MSWIN1251
для
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDB12Home1
7 мар 19, 23:19    [21827791]     Ответить | Цитировать Сообщить модератору
 Re: Ломается кодировка при чтении данных из таблиц  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17146
Правильный Вася
Запрос

не имеет отношения к проблеме.

Правильный Вася
И в реестре стоит
NLS_LANG=RUSSIAN_RUSSIA.CL8MSWIN1251
для
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDB12Home1

"Все врут" (с)

Судя по
Правильный Вася
запрос
SELECT dump('€',1016) from dual

возвращает
Typ=96 Len=3 CharacterSet=AL32UTF8: e2,82,ac


серверный characterset суть al32utf8.
Если бы для SQL Assistant действовала CL8MSWIN1251, то Вы получили бы "?", а не "Вў", которая свидетельствует о попытке отобразить кодовую последовательность e2,82,ac в кодировке 1251.

...конкретно SQL Developer:
- джавный, oracle client не использует и потому на на NLS_LANG не реагирует
- внутренне-юникодный, ему такие проблемы не свойственны.
8 мар 19, 00:22    [21827801]     Ответить | Цитировать Сообщить модератору
 Re: Ломается кодировка при чтении данных из таблиц  [new]
Правильный Вася
Member

Откуда:
Сообщений: 145
andrey_anonymous
"Все врут" (с)

Удивительно, но запрос
SELECT Sys_Context( 'USERENV', 'language' ) FROM Dual

возвращает RUSSIAN_RUSSIA.AL32UTF8

Тогда не понимаю, почему значение из реестра не берётся?
9 мар 19, 16:26    [21828416]     Ответить | Цитировать Сообщить модератору
 Re: Ломается кодировка при чтении данных из таблиц  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17146
Правильный Вася
Удивительно, но запрос

Попытка узнать кодировку клиента запросом к серверу - идея не очень удачная, сервер о ней просто не знает, за ненадобностью.
Взялось-не взялось...
Под Win есть много мест, откуда oracle клиент выдернет кодировку.
Первый приоритет - переменная окружения NLS_LANG, которая может быть задана:
- локально в процессе (обычно при запуске приложения пакетным файлом).
- унаследована из пользовательских переменных
- унаследована из общесистемных переменных
Далее - штук пять ключей в реестре в приоритете "от частного к общему", я их давно и прочно забыл за ненадобностью.
Вроде как в platform guide было описание реестра, попробуйте там посмотреть... только переменные окружения в любом случае приоритетнее.
9 мар 19, 17:12    [21828430]     Ответить | Цитировать Сообщить модератору
 Re: Ломается кодировка при чтении данных из таблиц  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17146
C:\>set NLS_LANG=.RU8PC866

C:\>sqlplus user/pass@db

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

SQL> SELECT Sys_Context( 'USERENV', 'language' ) FROM Dual;

SYS_CONTEXT('USERENV','LANGUAGE')
--------------------------------------------------------------------------------
AMERICAN_AMERICA.CL8MSWIN1251


-- "Взялось" ли cp866? Cохраним строчку в кодировке консоли:

SQL> create table dropme_t(x) as select 'Правильный Вася' from dual;

Table created.

SQL> quit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

-- Переключим консоль в 1251
C:\>chcp 1251
Текущая кодовая страница: 1251

C:\>set NLS_LANG=.CL8MSWIN1251

C:\>sqlplus user/pass@db

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

SQL> select * from dropme_t;

X
---------------
Правильный Вася

-- Как видим, получили обратно ту же строчку, но уже в кодировке 1251.
-- Сталбыть, окружение настроено правильно.

SQL> quit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

C:\>
9 мар 19, 17:24    [21828433]     Ответить | Цитировать Сообщить модератору
 Re: Ломается кодировка при чтении данных из таблиц  [new]
Правильный Вася
Member

Откуда:
Сообщений: 145
Спасибо.

andrey_anonymous
Первый приоритет - переменная окружения NLS_LANG

Почему-то для SQL Assistant не помогает, ничего не поменялось.
Устанавливал поочередно и в батнике, и в общесистемных.

andrey_anonymous
- локально в процессе (обычно при запуске приложения пакетным файлом).

Такой метод пытался использовать и для еще одной программы, но тоже не помогало. А вот через общесистемные для нее помогло.

Теперь я еще больше в непонятках. В какой бубен еще стучать, вокруг какой пальмы прыгать...
9 мар 19, 20:52    [21828511]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить