Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблемы с кодировкой / 14 сообщений из 14, страница 1 из 1
16.06.2016, 11:26:01
    #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
16.06.2016, 11:36:13
    #39256962
user_new1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с кодировкой
Хочу добавить, что с отображением русского языка проблем нет, все отображается корректно. И вопросительные знаки не перевернутые, а обычные.
...
Рейтинг: 0 / 0
16.06.2016, 11:48:06
    #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
16.06.2016, 11:56:38
    #39256984
user_new1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с кодировкой
Спасибо за ответ, я видимо не точно написал, проблема эта и в sqlplus и в TOAD везде одинаковая.
Думается мне, что проблема именно в рассогласовании кодировок.
...
Рейтинг: 0 / 0
16.06.2016, 15:22:35
    #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
16.06.2016, 15:25:21
    #39257201
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с кодировкой
user_new1,

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

p.s. Чтобы скопировать текст из cmd.exe
Установи в свойствах окна галочку быстрая вставка и выделение мышью
Далее выделяешь мышкой текст, нажимаешь Enter и выделенный текст в буфере
Вставка буфера в cmd.exe - правая кнопка мыши
...
Рейтинг: 0 / 0
16.06.2016, 16:29:37
    #39257238
user_new1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с кодировкой
...
Рейтинг: 0 / 0
16.06.2016, 16:30:00
    #39257239
user_new1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с кодировкой
...
Рейтинг: 0 / 0
16.06.2016, 17:51:17
    #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
16.06.2016, 18:30:57
    #39257344
user_new1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с кодировкой
...
Рейтинг: 0 / 0
16.06.2016, 21:51:44
    #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
17.06.2016, 20:43:05
    #39258131
user_new1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с кодировкой
Спасибо, что попытались помочь. Пошел читать документацию.
...
Рейтинг: 0 / 0
18.06.2016, 20:45:06
    #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
20.06.2016, 04:52:36
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблемы с кодировкой / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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