powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Convert в Win-1251
8 сообщений из 8, страница 1 из 1
Convert в Win-1251
    #39434395
Ceib
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Работаю с Oracle 11.2.0.4. Есть задачка - сформировать файлик по данным и положить в таблицу в кодировке windows-1251. В самой базе настройки следующие
NLS_NCHAR_CHARACTERSET AL16UTF16

NLS_CHARACTERSET AL32UTF8

Процедура формирования файлика:
Код: 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.
procedure form_file(p_date in date default trunc(sysdate-1)) as
  l_clob clob;
  f_blob blob;
  l_id number;
  line varchar2(32767);
  s_offset pls_integer := 1;
  d_offset pls_integer := 1;
  def_lang_context pls_integer := dbms_lob.DEFAULT_LANG_CTX;
  wrn pls_integer;
begin
  dbms_lob.createtemporary(l_clob, true);
  
  line := 'Некоторый русский текст';
  line := convert(line, 'CL8MSWIN1251');
  
  dbms_lob.writeappend(lob_loc => l_clob,
                       amount => lengthc(line),
                       buffer => line
                      );
  
  for rec in (select some_string
                from some_table
              )
    loop
      line := some_string;
      line := convert(line, 'CL8MSWIN1251');
      dbms_lob.writeappend(lob_loc => l_clob,
                           amount => lengthc(line),
                           buffer => line
                          );
    end loop;
  
  insert into ra_upload_files(file_name, mimetype, up_file, filecharset, file_date, description) 
    values('Report.csv', 'text/plain', empty_blob(), 'CL8MSWIN1251', sysdate, 'TEST.') 
    returning id, up_file into l_id, f_blob;
  dbms_lob.open(f_blob, dbms_lob.lob_readwrite);   
  
  begin
    dbms_lob.converttoblob(dest_lob => f_blob,
                           src_clob => l_clob,
                           amount => dbms_lob.getlength(l_clob),
                           dest_offset => d_offset,
                           src_offset => s_offset, 
                           blob_csid => dbms_lob.DEFAULT_CSID,
                           lang_context => def_lang_context,
                           warning => wrn);
    dbms_lob.close(f_blob);
    commit;
  exception when others then dbms_lob.close(f_blob);
                             raise;
  end;

  dbms_lob.freetemporary(l_clob);
end form_file;



Доступ к скачиванию файлов предоставляется через форму в приложении APEX. Кодировка в полученном файле получается битая - кракозябры.
Пробовал явно указывать исходную кодировку:
Код: plsql
1.
convert(line, 'CL8MSWIN1251', 'AL32UTF8');


Пробовал делать тоже самое через RAW - конвертировать строку в raw, изменить кодировку и конверт обратно в строку - результат тот же.
Подскажите, в чем может быть проблема?
...
Рейтинг: 0 / 0
Convert в Win-1251
    #39434405
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У текста нет кодировки. Кодировку надо указывать только при конвертации в байты.
...
Рейтинг: 0 / 0
Convert в Win-1251
    #39434411
Ceib
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

Указал явно кодировку при преобразовании в BLOB:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT NLS_CHARSET_ID('CL8MSWIN1251') into csid FROM DUAL; 
dbms_lob.converttoblob(dest_lob => f_blob,
                           src_clob => l_clob,
                           amount => dbms_lob.getlength(l_clob),
                           dest_offset => d_offset,
                           src_offset => s_offset, 
                           blob_csid => csid,
                           lang_context => def_lang_context,
                           warning => wrn);



Все заработало, спасибо!
...
Рейтинг: 0 / 0
Convert в Win-1251
    #39434694
ORA__SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicУ текста нет кодировки. Кодировку надо указывать только при конвертации в байты.Ну ну. А текст откуда появился
...
Рейтинг: 0 / 0
Convert в Win-1251
    #39434701
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORA__SQLElicУ текста нет кодировки. Кодировку надо указывать только при конвертации в байты.Ну ну. А текст откуда появилсяРаспечатай эту страницу и скажи, какая кодировка у текста на ней.
...
Рейтинг: 0 / 0
Convert в Win-1251
    #39434708
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicУ текста нет кодировкиты еще скажи, что у даты нет формата
...
Рейтинг: 0 / 0
Convert в Win-1251
    #39434712
ORA__SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicORA__SQLпропущено...
Ну ну. А текст откуда появилсяРаспечатай эту страницу и скажи, какая кодировка у текста на ней.Если я напишу текст от руки, то кодировки нет
А если я распечатаю эту страницу, то источник этого текста байты
...
Рейтинг: 0 / 0
Convert в Win-1251
    #39434718
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORA__SQLисточник этого текста байтыВроде же соображаешь.
Ещё раз: кодировка - это свойство последовательности байтов.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Convert в Win-1251
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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