Страницы

Поиск по вопросам

среда, 29 января 2020 г.

Запрос строки из БД выводит нечитабельные символы вместо кириллических

#sql #oracle #кодировка #клиент


Пытаюсь в клиентской программе с помощью запроса к БД:

select 'АБВГДЕЙКА' from dual; 


вывести кирилические символы, но получаю или:  


  ??????????????????


, или квадратики, а так-же другие кракозябры.

Какие пути решения проблемы? 
    


Ответы

Ответ 1



TL;DR Почти без исключений проблема кроется в различных кодировках (charachter set) установленных в программе-клиенте (далее клиент) и в БД. Если кодировки не совпадают, то после получения символьных данных из БД в клиенте производится неявная перекодировка этих данных из кодировки установленной в БД в кодировку установленную в клиенте. Неверно установленная кодировка в клиенте приведёт к неверному отображению символов. Когда перекодировка в кириллицу возможна? Если кодировка в клиенте является подмножеством кодировки в БД, т.е. все символы кодировки на клиенте содержаться в кодировке БД. Например, если в БД установлены: US7ASCII (только 7-ь бит), EE8MSWIN1250 или EE8ISO8859P2 (восточноевропейские языки) и подобные им, то перекодировка невозможна. Многосимвольные кодировки: AL32UTF8, AL16UTF16 и т.п. - не должны вызывать проблем. Как узнать, какая кодировка установлена в БД? select value from nls_database_parameters where parameter = upper ('nls_characterset'); Как установить нужную кодировку в клиенте? Зависит собственно от клиента, но в большинстве случаев, т.к. используют одни и те же библиотеки доступа к БД (OCI, JDBC), действуют установки в следующей последовательности (последовательность важна, из нескольких последняя выиграет): (Только Windows) в реестре: HKLM\SOFTWARE\ORACLE\KEY_[Client_home1]: NLS_LANG=.CL8MSWIN1251 В переменной окружения NLS_LANG WIN: Свойствa системы -> Дополнительно -> Переменные среды или в командном интерпретере: set NLS_LANG=.CL8MSWIN1251 UNIX: ~/.profile или в терминале: export NLS_LANG=.CL8MSWIN1251 Программа-клиент может иметь свои собственные установки, которые перепишут все выше описанные. Значение NLS_LANG состоит из 3-х независимых друг-от-друга частей и имеет форму: language_territory.characterset, например NLS_LANG = AMERICAN_RUSSIA.CL8MSWIN1251. В данной теме интересна последняя часть после точки. Кодировка в клиенте установлена правильно, но увы, куда смотреть дальше? В программе или терминале не установлена поддержка кириллических символов. WIN: в командном интерпретере вывод chcp совпадает с желаемой кодировкой? Попробуйте изменить, например: chcp 1251 UNIX: проверте переменную окружения: env | grep LANG В программе могут быть специальные установки для поддержки различных кодировок, например в SQL Developer: Preferences -> (+) Environment -> Encoding: [ ... ] Установленный шрифт не поддерживает кириллические символы. Попробуйте заменить шрифт по-умолчанию. Кодировка в клиенте изменнена после того, как с предедущей кодировкой были произведены операци изменения (или вставки). Все измененые в БД данные, содержащие кириллические символы - "мусор". Удалите изменения и повторите их после установки правильной кодировки в клиенте. Подробнее в офф. документации.

Комментариев нет:

Отправить комментарий