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

Откуда:
Сообщений: 124
И снова вопрос про то, как преобразовать нечитабельное в читабельное. Дело в том, что у нас сама база в ДОС-кодировке. Посмотрел свойства
select * from sys.props$, там стоит NLS_CHARACTERSET кодировка RU8PC866, т.е. видимо, изначальное неправильно базу сделали. Соответственно, функция convert ни к чему не приводит. Все выдается вопросами. Причем из любой кодировки в любую:
select convert('ЌЂЉ‹Ђ„ЌЂџ', 'CL8MSWIN1251', 'RU8PC866') from dual;
select convert('ЌЂЉ‹Ђ„ЌЂџ', 'RU8PC866', 'CL8MSWIN1251') from dual;
Результат один: все в вопросах.
Может, кто сталкивался с подобным.
Спасибо.
5 янв 05, 09:46    [1227119]     Ответить | Цитировать Сообщить модератору
 Re: Опять про кодировки  [new]
Elic
Member

Откуда:
Сообщений: 29976
Dost_gr
NLS_CHARACTERSET кодировка RU8PC866
select convert('ЌЂЉ‹Ђ„ЌЂџ', 'CL8MSWIN1251', 'RU8PC866') from dual;
select convert('ЌЂЉ‹Ђ„ЌЂџ', 'RU8PC866', 'CL8MSWIN1251') from dual;
Результат один: все в вопросах
Эксперемент поставлен неверно :) Вопросы появились в запросе ещё на этапе передачи запроса от клиента к серверу вследствие nls-конвертации из клиентской 1251-кодировки в серверную 866. Убедись:
select sql_text from v$sqlarea where sql_text like '%convert%dual%'
Ничего страшного в NLS_CHARACTERSET=RU8PC866 нет. Кроме домыслов какие конкретно проблемы?
5 янв 05, 10:20    [1227159]     Ответить | Цитировать Сообщить модератору
 Re: Опять про кодировки  [new]
Dost_gr
Member

Откуда:
Сообщений: 124
У нас есть два сервера. Так вот, на одном CL8MSWIN1251, там все работает без проблем, соответственно выдается что-то вроде
select convert('ЌЂЉ‹Ђ„ЌЂџ', 'CL8MSWIN1251', 'RU8PC866') from dual,
второй сервер (тот, что с RU8PC866) выдает соответственно
select convert('?????????','CL8MSWIN1251', 'RU8PC866') from dual.
5 янв 05, 10:30    [1227170]     Ответить | Цитировать Сообщить модератору
 Re: Опять про кодировки  [new]
Dost_gr
Member

Откуда:
Сообщений: 124
А проблемы из-за этого проявляются в том, что при загрузке с web-формы (типа сайта с заявками, чтобы пользователи могли удаленно делать заявки), выгрузка с сайта осуществляется кракозяблами досовыми.
5 янв 05, 10:32    [1227173]     Ответить | Цитировать Сообщить модератору
 Re: Опять про кодировки  [new]
Elic
Member

Откуда:
Сообщений: 29976
Dost_gr
А проблемы из-за этого проявляются в том, что при загрузке с web-формы (типа сайта с заявками, чтобы пользователи могли удаленно делать заявки), выгрузка с сайта осуществляется кракозяблами досовыми.
Это проблемы неправильно настроенного WEB-сервера. WEB-сервер - это клиент для Oracle-а. Его нужно правильно настроить (NLS_LANG) и он будет получать данные из Oracle-а в нужной кодировке. А всякие convert-ы просто не нужны :)
5 янв 05, 10:56    [1227205]     Ответить | Цитировать Сообщить модератору
 Re: Опять про кодировки  [new]
Dost_gr
Member

Откуда:
Сообщений: 124
Точно дело в web-сервере?
А если я открываю Досовое окно SqlPlus-ное, пытаюсь там что-то набрать, все русские таблицы также криво отображаются. И почему тогда не работает функция convert? хотелось бы сейчас с этим разобраться, потом уже лезть на web-сервер.
5 янв 05, 11:11    [1227225]     Ответить | Цитировать Сообщить модератору
 Re: Опять про кодировки  [new]
Elic
Member

Откуда:
Сообщений: 29976
Dost_gr
если я открываю Досовое окно SqlPlus-ное, все русские таблицы также криво отображаются.
Потому что не умеешь настраивать. В Win по умолчанию клиентская кодировка CL8MSWIN1251. В консоли же по умолчанию кодовая страница cp866. Вот оно и крякозяблит.
Правильная настройка консольного плюса заключается в изменении NLS_LANG:
консоль
set nls_lang=russian_cis.ru8pc866
sqlplus ...

Dost_gr
И почему тогда не работает функция convert?
Она работает. Но ты про неё забудь. Она для крайних случаев, когда есть понимание того, зачем её нужно применять. Ты же не понимаешь базовых принципов nls-конвертации между клиентом и сервером.
Правильная NLS-настройка клиента решает большинство NLS-проблем.
5 янв 05, 11:50    [1227282]     Ответить | Цитировать Сообщить модератору
 Re: Опять про кодировки  [new]
Dost_gr
Member

Откуда:
Сообщений: 124
Извиняюсь, что тема ушла далеко на задворки, просто праздники....
Вот что я сделал, для проверки, сервер ли глючит или web-сервер(клиент).
DECLARE
txtfile utl_file.file_type;
FILE_NAME VARCHAR2(200) := 'my_file.txt';
BEGIN

TXTFILE:=UTL_FILE.FOPEN('/u02/o817/product/81700/oraFiles',FILE_NAME,'w');

utl_file.PUT_line(txtfile,'СТРОКА');

utl_file.PUT_line(txtfile, CONVERT('СТРОКА','RU8PC866','CL8MSWIN1251' ) );

UTL_FILE.FCLOSE(TXTFILE);
exception
when no_data_found then
UTL_FILE.FCLOSE(TXTFILE);
END;
Сохранил файл, проверил его на сервере, вот что получил:
‘’ђЋЉЂ
??????
11 янв 05, 08:45    [1234213]     Ответить | Цитировать Сообщить модератору
 Re: Опять про кодировки  [new]
Elic
Member

Откуда:
Сообщений: 29976
Dost_gr
Вот что я сделал, для проверки, сервер ли глючит или web-сервер(клиент).
utl_file.PUT_line(txtfile,'СТРОКА');
utl_file.PUT_line(txtfile, CONVERT('СТРОКА','RU8PC866','CL8MSWIN1251' ) );
Сохранил файл, проверил его на сервере, вот что получил:
‘’ђЋЉЂ
??????
Это доказывает лишь то, что на сервере RU8PC866 (поскольку файл имеет dos-кодировку). И больше ничего.
Соответственно конвертация RU8PC866-строки из CL8MSWIN1251 в RU8PC866 абсолютно бессмысленна и доказывает лишь твоё полное непонимание данного вопроса.
11 янв 05, 09:05    [1234243]     Ответить | Цитировать Сообщить модератору
 Re: Опять про кодировки  [new]
Dost_gr
Member

Откуда:
Сообщений: 124
Согласен про непонимание или недопонимание.
Но ведь я затем и здесь. Как тогда перекодировать?
Думаете я не пробовал обратный вариант:
utl_file.PUT_line(txtfile, CONVERT('СТРОКА','CL8MSWIN1251','RU8PC866' ) );
Не помогает.
11 янв 05, 09:13    [1234251]     Ответить | Цитировать Сообщить модератору
 Re: Опять про кодировки  [new]
Elic
Member

Откуда:
Сообщений: 29976
Я тебе уже который день толкую, что не надо ничего "перекодировать". Забудь про convert.
Настрой правильно клиента (т.е. web-server).
11 янв 05, 09:21    [1234263]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Опять про кодировки  [new]
May12
Member

Откуда: ТУЛЫП
Сообщений: 877
Elic, растолкуйте теперь мне. Вот процедура, которая таблицу пишет в CSV файл:
CREATE OR REPLACE procedure MAYA.dump_table_to_csv(p_tname in varchar2)
    is
        l_output        utl_file.file_type;
        l_theCursor     integer default dbms_sql.open_cursor;
        l_columnValue   varchar2(4000);
        l_status        integer;
        l_query         varchar2(1000)  default 'select * from ' || p_tname || ' where  rownum < 1001';  
                        
                        
       l_colCnt        number := 0;
       l_separator     varchar2(1);
       l_descTbl       dbms_sql.desc_tab;
       
       
       ddate VARCHAR2(16):= TO_CHAR (SYSDATE, 'YYYYMMDDHHMISS');
       p_filename varchar2(200) := p_tname||'_'||ddate||'.csv';
       p_dir  varchar2 (200) := 'DIR$TEST';
       
  begin
      l_output := utl_file.FOPEN(p_dir, p_filename, 'w', 32000 );
        
       dbms_sql.parse(  l_theCursor,  l_query, dbms_sql.native );
       dbms_sql.describe_columns( l_theCursor, l_colCnt, l_descTbl );
   
       for i in 1 .. l_colCnt loop
           
           utl_file.put( l_output, convert(l_separator || '' || l_descTbl(i).col_name || '', 'CL8MSWIN1251', 'AL32UTF8')); -- при необходимости указываем кавычки для заключения колонок хедера в кавычки
           
           dbms_sql.define_column( l_theCursor, i, l_columnValue, 15000 );
         l_separator := ';'; -- разделитель в хедере
        end loop;
      utl_file.new_line(l_output);
  
      l_status := dbms_sql.execute(l_theCursor);
   
      while ( dbms_sql.fetch_rows(l_theCursor) > 0 ) loop
           l_separator := '';
          for i in 1 .. l_colCnt loop
               dbms_sql.column_value( l_theCursor, i, l_columnValue );
               utl_file.put( l_output, convert(l_separator || l_columnValue,  'CL8MSWIN1251', 'AL32UTF8'));
               l_separator := ';';
           end loop;
           utl_file.new_line( l_output );
       end loop;
       dbms_sql.close_cursor(l_theCursor);
       utl_file.fclose( l_output );
   
    
   end;
/


Как сделать так чтобы она не обрезала создаваемом файле последние несколько символов у слов, которые в кириллице? Спасибо.

Ах да:
- мне нужен файлик в кодировке WIN1251;
-
PARAMETER VALUE
NLS_CHARACTERSET AL32UTF8
NLS_NCHAR_CHARACTERSET AL16UTF16
5 июн 13, 18:33    [14396492]     Ответить | Цитировать Сообщить модератору
 Re: Опять про кодировки  [new]
-2-
Member

Откуда:
Сообщений: 15330
May12
Ах да
тебе уже не одну тему объясняли, что текстовый режим записи через ult_file корректно работает только с кодировкой БД.
5 июн 13, 20:20    [14396787]     Ответить | Цитировать Сообщить модератору
 Re: Опять про кодировки  [new]
May12
Member

Откуда: ТУЛЫП
Сообщений: 877
-2-, спасибо. Вы такой хороший.
Т.е. правильный ответ: сделать корректную выгрузку текста в файл в кодировке 1251 средствами Oracle в моем случае невозможно?
Кодировку базы менять не могу.

P.s. Amkad это точно умеет делать. Он умный и интеллигентный. Даже в интернете.
6 июн 13, 10:28    [14398310]     Ответить | Цитировать Сообщить модератору
 Re: Опять про кодировки  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18482
Ключевое слово было "текстовой"
6 июн 13, 10:32    [14398344]     Ответить | Цитировать Сообщить модератору
 Re: Опять про кодировки  [new]
May12
Member

Откуда: ТУЛЫП
Сообщений: 877
Вот эта функция за авторством AmKad'а.
6 июн 13, 10:34    [14398360]     Ответить | Цитировать Сообщить модератору
 Re: Опять про кодировки  [new]
May12
Member

Откуда: ТУЛЫП
Сообщений: 877
Вячеслав Любомудров
Ключевое слово было "текстовой"

Вячеслав, здравствуйте. Вы как бы намекаете мне на UTL_FILE.PUT_RAW?
6 июн 13, 10:40    [14398397]     Ответить | Цитировать Сообщить модератору
 Re: Опять про кодировки  [new]
May12
Member

Откуда: ТУЛЫП
Сообщений: 877
Решено через функцию AmKad'а.
Всё равно - спасибо. =)))
6 июн 13, 17:41    [14401448]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить