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

Откуда: Москва -> London
Сообщений: 128
Есть база в западноевропейской кодировке. В ней хранятся "наши" данные. То есть если смотреть через Oracle content viewer то видишь мусор, а если через приложение - то всё ок.
Если копируешь мусор в Штирлиц- то он всё нормально перекодирует.


Вопрос - можно ли как-либо преобразовать кодировку в select?
смотрел функцию convert - но она упорно не хочет работать.

Спасибо.
20 дек 06, 17:58    [3562034]     Ответить | Цитировать Сообщить модератору
 Re: преобразование кодировок  [new]
Elic
Member

Откуда:
Сообщений: 29979
yallow
Если копируешь мусор в Штирлиц- то он всё нормально перекодирует.
И какой путь конвертации он показывает в строке статуса?
20 дек 06, 18:13    [3562146]     Ответить | Цитировать Сообщить модератору
 Re: преобразование кодировок  [new]
yallow
Member

Откуда: Москва -> London
Сообщений: 128
никак не найду у штирлица лог перекодировки. Как только копирую в него - он сразу преобразует.
Может есть другие тулзы для перекодировок - более информативные?
20 дек 06, 18:21    [3562200]     Ответить | Цитировать Сообщить модератору
 Re: преобразование кодировок  [new]
yallow
Member

Откуда: Москва -> London
Сообщений: 128
ÏÐÈÂÅÒ = ПРИВЕТ

Может у вас получится определить исходную кодировку?

Вопрос в том сможет ли так select?

Спасибо.
20 дек 06, 18:23    [3562220]     Ответить | Цитировать Сообщить модератору
 Re: преобразование кодировок  [new]
Elic
Member

Откуда:
Сообщений: 29979
yallow
ÏÐÈÂÅÒ = ПРИВЕТ
=> "Преобразований не производилось"
yallow
Может у вас получится определить исходную кодировку?
Коды символов соответствуют кодировке win1251. Т.е. ничего не надо преобразовывать (в чём штирлиц честно признался). Чтобы nls-конвертация не производилась, нужно чтобы CHARACTERSET клиента был равен NLS_CHARACTERSET базы данных.
20 дек 06, 18:37    [3562333]     Ответить | Цитировать Сообщить модератору
 Re: преобразование кодировок  [new]
yallow
Member

Откуда: Москва -> London
Сообщений: 128
Elic
сорри, я не понял - что мне надо сделать?
20 дек 06, 19:29    [3562568]     Ответить | Цитировать Сообщить модератору
 Re: преобразование кодировок  [new]
Elic
Member

Откуда:
Сообщений: 29979
yallow
сорри, я не понял - что мне надо сделать?
Настроить клиента на кодировку сервера. STFF

P.S. А вообще, думать нужно было до создания БД :)
20 дек 06, 19:47    [3562614]     Ответить | Цитировать Сообщить модератору
 Re: преобразование кодировок  [new]
yallow
Member

Откуда: Москва -> London
Сообщений: 128
Базу не я создавал, а немцы - и менять кодировку они не собираются.
Как говорится "а с нашей стороны всё работает".

С приложением в котором мы работаем тоже всё ок, как я выше описал.

Теперь у меня есть права на чтение этой базы и нужно сделать правильную выгрузку русских данных, которые в базе выглядят так - ÏÐÈÂÅÒ . Для этого и нужно преобразование.

Ладно - судя по всему, ты советуешь поменять кодировку Oracle Client на кодировку базы (западноевропейскую), и в этом случае результат select из таблиц базы изменится.

Не совсем конечно это логично - во-первых, на самой базе кодировка одинаковая на клиенте и сервере - соответственно, и выводить в кириллице ей нет никакого резона.

А во-вторых, мне кажется настройки клиентской части не должны влиять на результат работы select? не так?

Предположим, я установлю западноевропейскую кодировку в Oracle Client на своей машине - и на каком этапе она будет осуществлять конвертацию( ÏÐÈÂÅÒ -> ПРИВЕТ)?
20 дек 06, 20:17    [3562683]     Ответить | Цитировать Сообщить модератору
 Re: преобразование кодировок  [new]
yallow
Member

Откуда: Москва -> London
Сообщений: 128
Гы
select convert(summary,'CL8MSWIN1251', 'WE8ISO8859P15') from

выдаёт
I?EAAO


"Почти" правильно преобразовала :)
20 дек 06, 20:29    [3562708]     Ответить | Цитировать Сообщить модератору
 Re: преобразование кодировок  [new]
Elic
Member

Откуда:
Сообщений: 29979
yallow
А во-вторых, мне кажется настройки клиентской части не должны влиять на результат работы select? не так?
Не так. RTFM Should the NLS_LANG Setting Match the Database Character Set? (FAQ)
yallow
Предположим, я установлю западноевропейскую кодировку в Oracle Client на своей машине - и на каком этапе она будет осуществлять конвертацию( ÏÐÈÂÅÒ -> ПРИВЕТ)?
В том и весь фокус, что ни на каком. Она не нужна и даже вредна, поскольку эти две строки побайтно равны. Клиент просто должен отображать их в в правильной codepage.
20 дек 06, 20:44    [3562746]     Ответить | Цитировать Сообщить модератору
 Re: преобразование кодировок  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
yallow
А во-вторых, мне кажется настройки клиентской части не должны влиять на результат работы select? не так?


Не так. Библиотека клиента Oracle возьмёт строки в кодировке БД, преобразует их в свою кодировку (NLS_LANG) и вернёт их в таком виде в программу. Если программа ожидает строки в другой кодировке (например в кодировке операционной системы) возникнет проблема.
Кодировка клиента должна совпадать с кодировкой программы.

На стыке СУБД-клиент, клиент контролирует преобразование кодировок, но на стыке клиент-приложение такой проверки нет. Этим фактом можно воспользоваться, например для того чтобы в западноевропейской БД хранить русские строки, при этом лишив себя возможности автоматического преобразования этих строк в другие кодировки.

Когда кодировка БД и клиента (NLS_LANG) совпадают, то на клиенте преобразования не требуются, символы сохраняются в БД как есть, но не в кодировке БД, а фактически в кодировке приложения. Такая же ситуация наблюдается и при несовпадении кодировок клиента и БД, но при этом часто в строках теряется часть символов.

yallow
Предположим, я установлю западноевропейскую кодировку в Oracle Client на своей машине - и на каком этапе она будет осуществлять конвертацию( ÏÐÈÂÅÒ -> ПРИВЕТ)?


Если сама программа перекодировкой не занимается, то на этапе отображения строки на экране вместо кодов будут нарисованы буквы. За преобразование кодов в буквы отвечает фонт.
Короче нужно брать строки из БД в кодировке БД и в программе преобразовывать их в нужную кодировку.
20 дек 06, 21:00    [3562781]     Ответить | Цитировать Сообщить модератору
 Re: преобразование кодировок  [new]
yallow
Member

Откуда: Москва -> London
Сообщений: 128
Elic
Предположим, я установлю западноевропейскую кодировку в Oracle Client на своей машине - и на каком этапе она будет осуществлять конвертацию( ÏÐÈÂÅÒ -> ПРИВЕТ)?
В том и весь фокус, что ни на каком. Она не нужна и даже вредна, поскольку эти две строки побайтно равны. Клиент просто должен отображать их в в правильной codepage.[/quot]

Может быть, я зря вообще писал про конвертацию данных, нужно действительно поменять codepage при отображении данных.
Буду пробовать...
21 дек 06, 10:20    [3563896]     Ответить | Цитировать Сообщить модератору
 Re: преобразование кодировок  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
yallow
Предположим, я установлю западноевропейскую кодировку в Oracle Client на своей машине - и на каком этапе она будет осуществлять конвертацию( ÏÐÈÂÅÒ -> ПРИВЕТ)?
Как уже было сказано накакого преобразования не требуется. Требуется настроить отображение на клиенте.
Для этого, если это клиент под MS Windows, можно попробовать сделать так:

0. запустить REGEDIT

1. Наити поиском c_1252.nls
Это будет значение HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Nls\CodePage\1252
заменить это значение на c_1251.nls

2. Наити поиском c_1252.nls
Это будет значение HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\1252
заменить это значение на c_1251.nls

3. Наити поиском c_1252.nls
Это будет значение HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Control\Nls\CodePage\1252
заменить это значение на c_1251.nls (такого может не быть)

4. Перезагрузить клиентский компьютер.

После этого должны ÏÐÈÂÅÒ выглядеть, как ПРИВЕТ, т.к. вы подменяете кодовую страницу.

Побочный эфект: вместо букв западноевропейских (с оксанами и умляутами)
вы теперь всегда будете видеть русские.

Если что-то не так объяснил, то прошу знатоков Microsoft Windows меня поправить/уточнить.
21 дек 06, 10:38    [3564009]     Ответить | Цитировать Сообщить модератору
 Re: преобразование кодировок  [new]
Goldminer
Member

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

Теперь у меня есть права на чтение этой базы и нужно сделать правильную выгрузку русских данных, которые в базе выглядят так - ÏÐÈÂÅÒ . Для этого и нужно преобразование.
На самом деле главный вопрос: через ЧТО/при каких настройках они так выглядят (м.б. на немецкой системе?). В XP/2003 имеет смысл заглянуть в "Control panel->Regional and language options->Advanced" (Закладка видна только под админом.) Там есть язык для не-Юникодовских программ (д.б. русский).

А вообще-то, если задача -- выгрузить и результирующий формат -- ANSI текст (т.е. не Юникод), и выгружающее приложение не Юникодовское, то при соблюдении приведенных здесь рекомендаций по настройке клиента результат д.б. правильным независимо от того, что как выглядит. Т.е., он будет правильно читаться везде, где правильно читается русский текстовый файл.

PS: По рекомендациям SQL*Plus: негативные последствия (о которых он честно предупреждает) не должны коснуться Юникодовских программ (ИМХО, всех нынешних продуктов MS), но могут быть проблемы с перепиской (с немцами) -- явный подлог, как никак .
21 дек 06, 13:44    [3565421]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить