powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблемы с кодировкой
14 сообщений из 14, страница 1 из 1
Проблемы с кодировкой
    #39256951
user_new1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Как я понимаю данные вопросы уже затерты до дыр, но все равно прошу помочь разобраться.

Есть запрос найденный на этом форуме:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE
a varchar2(100);
b varchar2(100);
BEGIN
a := 'Привет!';
b := CONVERT(a, 'CL8MSWIN1251', 'UTF8');
dbms_output.put_line(b);
END;
--------------------------------------
Привет!



В нашей базе получаю вопросительные знаки.
В настройках базы NLS_CHARACTERSET = CL8ISO8859P5
В настройках ораклового клиента на машине настройки следующие:
NLS_LANG: RUSSIAN_RUSSIA.CL8MSWIN1251
NLS_CHARACTERSET: CL8ISO8859P5

Вопрос, как должно быть правильно выставлены настройки?

P.S. Если в реестре для ораклового клиента поставить NLS_LANG = RUSSIAN_RUSSIA.CL8ISO8859P5, то запрос будет возвращать слово "Привет", как и задумывается. Но правильна ли такая настройка.
...
Рейтинг: 0 / 0
Проблемы с кодировкой
    #39256962
user_new1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хочу добавить, что с отображением русского языка проблем нет, все отображается корректно. И вопросительные знаки не перевернутые, а обычные.
...
Рейтинг: 0 / 0
Проблемы с кодировкой
    #39256978
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user_new1,
Фонт не тот? Или клиент слишком умный
Проверьте так:
1) Запуститите CMD
2) Устновите для него фонт Lucida Console
3) переключите кодовую страницу 1251
Код: plsql
1.
C:\> chcp 1251


4) Установите переменную окружения NLS_LANG (чтобы перебить любые установки реестра)
Код: plsql
1.
C:\> set NLS_LANG=RUSSIAN_RUSSIA.CL8MSWIN1251


5) Зайдите в oracle через удобную учетную запись и sqlplus.exe и запустите тест
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> set serveroutput  on
SQL> DECLARE
a varchar2(100);
b varchar2(100);
BEGIN
a := 'Привет!';
b := CONVERT(a, 'CL8MSWIN1251', 'UTF8');
dbms_output.put_line(b);
END;
/
Привет!

PL/SQL procedure successfully completed.
SQL> 
...
Рейтинг: 0 / 0
Проблемы с кодировкой
    #39256984
user_new1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответ, я видимо не точно написал, проблема эта и в sqlplus и в TOAD везде одинаковая.
Думается мне, что проблема именно в рассогласовании кодировок.
...
Рейтинг: 0 / 0
Проблемы с кодировкой
    #39257197
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user_new1,

Тест выполнил полностью? Влючая chcp 1251 и set NLS_LANG?
Покажи вывод:
Код: plsql
1.
2.
3.
select parameter||'='||value as p from  nls_database_parameters;

select value from v$nls_valid_values where value like 'CL8%'  or value like 'RU%';
...
Рейтинг: 0 / 0
Проблемы с кодировкой
    #39257201
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user_new1,

Фонт тоже поправил в свойствах окна cmd.exe?

p.s. Чтобы скопировать текст из cmd.exe
Установи в свойствах окна галочку быстрая вставка и выделение мышью
Далее выделяешь мышкой текст, нажимаешь Enter и выделенный текст в буфере
Вставка буфера в cmd.exe - правая кнопка мыши
...
Рейтинг: 0 / 0
Проблемы с кодировкой
    #39257238
user_new1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Проблемы с кодировкой
    #39257239
user_new1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Проблемы с кодировкой
    #39257319
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select 
  convert(
    utl_raw.cast_to_varchar2(
      hextoraw('D0A0D19FD0A1D082D0A0D191D0A0D086D0A0C2B5D0A1E2809A21')
    )
  ,'CL8MSWIN1251','UTF8') 
from dual



Или так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE
a varchar2(100);
b varchar2(100);
BEGIN
a := utl_raw.cast_to_varchar2(
      hextoraw('D0A0D19FD0A1D082D0A0D191D0A0D086D0A0C2B5D0A1E2809A21')
    );
b := CONVERT(a, 'CL8MSWIN1251', 'UTF8');
dbms_output.put_line(b);
END;
...
Рейтинг: 0 / 0
Проблемы с кодировкой
    #39257344
user_new1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Проблемы с кодировкой
    #39257410
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim LejninА так:
Код: plsql
1.
,'CL8MSWIN1251','UTF8') 




Уважаемый коллега, Вы совершенно проигнорировали факт

user_new1В настройках базы NLS_CHARACTERSET = CL8ISO8859P5


что и предопределило неудачные советы.

Для указанных настроек NLS проводимый тест - бредовый и говорит о критическом непонимании процессов, происходящих при его выполнении.
Обоим порекомендовал бы внимательно, без спешки ознакомиться с globalization support guide, ибо объяснять одно и то же в этой конференции по надцатому разу желания нет... совсем нет.
http://www.sql.ru/forum/760038-2/kodirovka-bd?mid=8810016#8810016
...
Рейтинг: 0 / 0
Проблемы с кодировкой
    #39258131
user_new1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, что попытались помочь. Пошел читать документацию.
...
Рейтинг: 0 / 0
Проблемы с кодировкой
    #39258332
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,
авторВ настройках ораклового клиента на машине настройки следующие:
NLS_LANG: RUSSIAN_RUSSIA.CL8MSWIN1251
Код: plsql
1.
b := CONVERT(a, 'CL8MSWIN1251', 'UTF8');



докаCONVERT converts a character string from one character set to another.

The char argument is the value to be converted. It can be any of the data types CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB, or NCLOB.

The dest_char_set argument is the name of the character set to which char is converted.

The source_char_set argument is the name of the character set in which char is stored in the database. The default value is the database character set.



Андрей, не надо быть таким категоричным
пример демонстрирует конвертацию RAW данных из UTF8 в CL8MSWIN1251

В чем проблема?
Например в моем случае, для базы AL32UTF8 при установке клиента CL8MSWIN1251 тест проходит без проблем.
Преобразование кодировок происходит только когда данные отправляются на клиент или принимаются с него. Если кодировка клиента и базы совпадает, то преобразования данных не происходит совсем. Если кодировка

Разумеется часть функций не будут считать символами некоторые коды. Поэтому Не будут работать upper/lower/initcap



(при ограничениях
...
Рейтинг: 0 / 0
Проблемы с кодировкой
    #39258602
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim LejninНапример в моем случае, для базы AL32UTF8 при установке клиента CL8MSWIN1251 тест проходит без проблем.Если ты про примерVadim LejninА так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select 
  convert(
    utl_raw.cast_to_varchar2(
      hextoraw('D0A0D19FD0A1D082D0A0D191D0A0D086D0A0C2B5D0A1E2809A21')
    )
  ,'CL8MSWIN1251','UTF8') 
from dual



Или так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE
a varchar2(100);
b varchar2(100);
BEGIN
a := utl_raw.cast_to_varchar2(
      hextoraw('D0A0D19FD0A1D082D0A0D191D0A0D086D0A0C2B5D0A1E2809A21')
    );
b := CONVERT(a, 'CL8MSWIN1251', 'UTF8');
dbms_output.put_line(b);
END;

То оно и понятно -- у тебя тут дважды преобразованная строка, один раз обратное преобразование проходит явно (convert), а второй раз неявно (кодировка БД -> кодировка клиента)
Это как раз пример "магии данных" и хороший пример что все символы 1251 правильно преобразуются в UNICODE

И все-же про кое-какое неявное преобразование ты забываешь.
Суть в том что получившийся поток байт после CONVERT является просто потоком байт, информации о кодировке нет
И DBMS_OUTPUT (или SELECT) считает, что этот поток байт именно в кодировке БД (в твоем случае после первого преобразования у тебя действительно получился юникод, что совпадает с кодировкой БД)
А если это будет что-либо зависящее от кодировки (тот-же CONVERT) результат будет разный
А уж только потом выстрелит преобразование кодировки БД->клиент
Вариации на тему твоего примерчика
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
C:\>chcp 1251
Active code page: 1251

C:\>set NLS_LANG=RUSSIAN_RUSSIA.CL8MSWIN1251

C:\>sqlplus system@orcl

SQL*Plus: Release 11.2.0.3.0 Production on Пн Июн 20 11:22:37 2016

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Введите пароль:

Присоединен к:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> select value from NLS_DATABASE_PARAMETERS where parameter='NLS_CHARACTERSET';

VALUE
----------------------------------------
CL8MSWIN1251

SQL> select rawtohex(convert(convert('Привет!', 'UTF8', 'CL8MSWIN1251'), 'UTF8', 'CL8MSWIN1251')) from dual;

RAWTOHEX(CONVERT(CONVERT('ПРИВЕТ!','UTF8',CL8MSWIN1
----------------------------------------------------
D0A0D19FD0A1D082D0A0D191D0A0D086D0A0C2B5D0A1E2809A21

SQL> select convert(
  2             convert(
  3                 utl_raw.cast_to_varchar2(
  4                     hextoraw('D0A0D19FD0A1D082D0A0D191D0A0D086D0A0C2B5D0A1E2809A21')
  5                 ), 'CL8MSWIN1251', 'UTF8'
  6             ), 'CL8MSWIN1251', 'UTF8'
  7         ) from dual;

CONVERT(CONVERT(UTL_RAW.CAST_TO_VARCHAR2(HEXTORAW(D0A0D19FD0A1D082D0A0D191D0A0D
--------------------------------------------------------------------------------
Привет!

SQL> connect system@tst
Введите пароль:
Соединено.
SQL> select value from NLS_DATABASE_PARAMETERS where parameter='NLS_CHARACTERSET';

VALUE
----------------------------------------
CL8ISO8859P5

SQL> select rawtohex(convert(convert('Привет!', 'UTF8', 'CL8MSWIN1251'), 'UTF8', 'CL8MSWIN1251')) from dual;

RAWTOHEX(CONVERT(CONVERT('ПРИВЕТ!','UTF8',CL8MSWIN1
----------------------------------------------------
D0A1E28094D0A0C2B0D0A0D081D0A0D19ED0A0D290D0A0D08621

SQL> select convert(
  2             convert(
  3                 utl_raw.cast_to_varchar2(
  4                     hextoraw('D0A0D19FD0A1D082D0A0D191D0A0D086D0A0C2B5D0A1E2809A21')
  5                 ), 'CL8MSWIN1251', 'UTF8'
  6             ), 'CL8MSWIN1251', 'UTF8'
  7         ) from dual;

CONVERT(CONVERT(UTL_RAW.CAST_TO_VARCHAR2(HEXTORAW(D0A0D19FD0A1D082D0A0D191D0A0D
--------------------------------------------------------------------------------
Я№штхђ!

SQL>

...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблемы с кодировкой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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