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

Откуда: Киев
Сообщений: 108
Замучался с преобразованием
Ситуация такая, база ORACLE в кодировке UTF-8, из базы выбираются данные и записываются в файл, дальше прога на яве берет файл и запихивает в PostgreSql который в свои очередь работает в кодировке KOI-8R.

Проблема в том, что в Oracle есть много данных с разными специфичискими для UNICODE символами (кавычки разные, номера, тире, плюсы-минусы одним знаком), в общем при попытке заинсертить в PostgreSql я получаю ошибки вида
org.postgresql.util.PSQLException: ERROR: character 0xce9c of encoding "UNICODE" has no equivalent in "KOI8"

Можно на Oracle вырезать все символы не UNICODE?
Пока начал решать вопрос через REPLACE но больно хлопотно это.
13 ноя 07, 12:45    [4908981]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строк UNICODE  [new]
Shmyg
Member

Откуда: Kiev
Сообщений: 56
Поскольку, насколько я понимаю, вначале идет запись в файл, то необходимо правильно настроить окружение клиента. Оракл преобразует данные сам. Т.е. если файл нужен в кодировке KOI8-R, то нужно на клиенте, который вытягивает данные, прописать NLS_LANG=AMERICAN_AMERICA.KOI8R, по-моему. Главное - правильно прописать часть после точки. Все возможные значения можно посмотреть в V$NLS_VALID_VALUES
13 ноя 07, 12:51    [4909032]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строк UNICODE  [new]
DinoRay
Member

Откуда: Киев
Сообщений: 108
Shmyg
Поскольку, насколько я понимаю, вначале идет запись в файл, то необходимо правильно настроить окружение клиента. Оракл преобразует данные сам. Т.е. если файл нужен в кодировке KOI8-R, то нужно на клиенте, который вытягивает данные, прописать NLS_LANG=AMERICAN_AMERICA.KOI8R, по-моему. Главное - правильно прописать часть после точки. Все возможные значения можно посмотреть в V$NLS_VALID_VALUES


Т.е. перед выгрузкой в файл Оракл проверяет NLS_LANG клиента и преобразует в соответствующую кодировку?
13 ноя 07, 12:56    [4909070]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строк UNICODE  [new]
Elic
Member

Откуда:
Сообщений: 29977
DinoRay
Т.е. перед выгрузкой в файл Оракл проверяет NLS_LANG клиента и преобразует в соответствующую кодировку?
Данные на клиента поступают уже сконвертированными в соответствии с его NLS_LANG.
Если только файл не пишется посредством utl_file :)
13 ноя 07, 13:00    [4909110]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строк UNICODE  [new]
DinoRay
Member

Откуда: Киев
Сообщений: 108
Elic
DinoRay
Т.е. перед выгрузкой в файл Оракл проверяет NLS_LANG клиента и преобразует в соответствующую кодировку?
Данные на клиента поступают уже сконвертированными в соответствии с его NLS_LANG.
Если только файл не пишется посредством utl_file :)


Как раз utl_file )), почему и уточнил...
13 ноя 07, 13:01    [4909116]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строк UNICODE  [new]
Shmyg
Member

Откуда: Kiev
Сообщений: 56
А, если это utl_file, тогда другое дело. Как конвертировать в этом случае - не могу сказать. Нужно искать. Вообще, честно говоря, utl_file - не очень хорошая вещь. Например, с точки зрения безопасности. Вернее, я бы сказал так - использовать ее нужно с некоторой опаской. По-моему скромному мнению :)
А NLS_LANG проверяется при использовании, например, SQL*Plus. При этом, действительно, происходит конвертация.
13 ноя 07, 13:04    [4909133]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строк UNICODE  [new]
Elic
Member

Откуда:
Сообщений: 29977
DinoRay
Как раз utl_file
Для utl_file клиента не существует :) RTFM CONVERT (FAQ)
13 ноя 07, 13:04    [4909134]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строк UNICODE  [new]
DinoRay
Member

Откуда: Киев
Сообщений: 108
Elic
DinoRay
Как раз utl_file
Для utl_file клиента не существует :) RTFM CONVERT (FAQ)


Пробовал я CONVERT не получается...
convert(string,'UTF8','CL8KOI8R');

буказоиды пишутся и ничем не преобразуются
13 ноя 07, 13:08    [4909165]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строк UNICODE  [new]
ГостЪ
Guest
DinoRay

Пробовал я CONVERT не получается...
convert(string,'UTF8','CL8KOI8R');

буказоиды пишутся и ничем не преобразуются


Еще раз RTFM.
13 ноя 07, 13:11    [4909194]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строк UNICODE  [new]
Shmyg
Member

Откуда: Kiev
Сообщений: 56
UNICODE содержит те символы, которых нет в KOI8. Поэтому букозябры и есть.
13 ноя 07, 13:13    [4909220]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строк UNICODE  [new]
Elic
Member

Откуда:
Сообщений: 29977
DinoRay
convert(string,'UTF8','CL8KOI8R');
RTFM
CONVERT(char,dest_char_set[,source_char_set])

DinoRay
Поэтому букозябры и есть.
Зебра всего лишь одна
13 ноя 07, 13:17    [4909242]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строк UNICODE  [new]
DinoRay
Member

Откуда: Киев
Сообщений: 108
Тут даже вопрос не в том как записать в KOI потому как ява читает в UNICODE
а как на оракле из UNICODE сделать строку, не знаю как правильно назвать, чтобы символы были только в диапазоне он 0- до 254
13 ноя 07, 13:22    [4909288]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строк UNICODE  [new]
Elic
Member

Откуда:
Сообщений: 29977
DinoRay
из UNICODE сделать строку, не знаю как правильно назвать, чтобы символы были только в диапазоне он 0- до 254
convert+convert
13 ноя 07, 13:25    [4909311]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строк UNICODE  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18339
Elic
DinoRay
convert(string,'UTF8','CL8KOI8R');
RTFM
CONVERT(char,dest_char_set[,source_char_set])

Есть тут одна засадка, которую многие не учитывают при экспериментах...
Если проверять работу convert посредством клиентского приложения (sqlplus, toad, pl/sqldev и т.д.), то конвертированный текст будет подвергаться тому же преобразованию server_charset=>client_charset, как и любая другая строка. Результат будет соответствующий, если только не установить совпадающие серверную и клиентскую кодировки.
13 ноя 07, 13:28    [4909325]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строк UNICODE  [new]
DinoRay
Member

Откуда: Киев
Сообщений: 108
Elic
DinoRay
из UNICODE сделать строку, не знаю как правильно назвать, чтобы символы были только в диапазоне он 0- до 254
convert+convert


А по-подробней?
Я че-то не понял.
13 ноя 07, 13:29    [4909339]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строк UNICODE  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18339
Elic
DinoRay
из UNICODE сделать строку, не знаю как правильно назвать, чтобы символы были только в диапазоне он 0- до 254
convert+convert

Это если вопросики устраивают.
Если не устраивают - то проще сгенерировать весь набор символов KOI8, конвертнуть в UTF8 и пользоваться как шаблоном для translate
13 ноя 07, 13:29    [4909340]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строк UNICODE  [new]
Elic
Member

Откуда:
Сообщений: 29977
andrey_anonymous
Есть тут одна засадка, которую многие не учитывают при экспериментах...
Но не здесь :)
13 ноя 07, 13:30    [4909350]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строк UNICODE  [new]
DinoRay
Member

Откуда: Киев
Сообщений: 108
Попробовал для примера

select convert(convert('400Г±3%','UTF8','CL8KOI8R'),'CL8KOI8R','UTF8') from dual

Результат
400Г±3%

Но знака ± в KOI нет
13 ноя 07, 13:49    [4909485]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строк UNICODE  [new]
Elic
Member

Откуда:
Сообщений: 29977
DinoRay
select convert(convert('400Г±3%','UTF8','CL8KOI8R'),'CL8KOI8R','UTF8') from dual
"Ну ты тупой" Больше нет сил :)
13 ноя 07, 14:02    [4909581]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строк UNICODE  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18339
DinoRay
Попробовал для примера

Вас уже отправляли в RTFM.
Повторите процедуру и больше не грешите:
SQL> select convert(convert('400Г±3%','CL8KOI8R','UTF8'),'UTF8','CL8KOI8R') from dual;
 
CONVERT(CONVERT('400Г±3%','CL8
------------------------------
400Г∎3%
 
SQL> 
13 ноя 07, 14:05    [4909597]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование строк UNICODE  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18339
Elic
andrey_anonymous
Есть тут одна засадка, которую многие не учитывают при экспериментах...
Но не здесь :)

Не факт, что автор отлаживается прямо на utl_file
13 ноя 07, 14:06    [4909602]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить