Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Perl, DBI, чтение кириллицы из базы Oracle 9i, Знаки вопроса вместо текста 
V
    Опции темы
RETROme
  Дата 26.9.2008, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 23.9.2008

Репутация: нет
Всего: нет



Как правильно осуществить чтение русского текста из базы Oracle 9i с помощью DBI в Perl (5.8.0 версии)?
PM MAIL   Вверх
nitr
Дата 26.9.2008, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



RETROme, уточните вопрос, более детально опишите.
В какой кодировке у вас БД?


--------------------
PM   Вверх
RETROme
  Дата 26.9.2008, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 23.9.2008

Репутация: нет
Всего: нет



nitr, я так понимаю, универсального метода нет? Доступа к администрированию сервера с базой не имею, есть доступ только к самой базе. Исходная кодировка должна быть cp1251. Сейчас код примерно такой (собственно та часть, где идёт работа с базой):
Код

use encoding "cp1251";
use DBI;

my $filename = "data.dat";
open ($fh, "> $filename");
binmode ($fh);

my $DB_NAME = 'name';
my $DB_USER = 'user';
my $DB_P = 'base';
my $DB_HOST = 'ip';
my $DB_PORT = 'port';
my $DB = DBI->connect("dbi:Oracle:host=$DB_HOST; sid=$DB_NAME; port=$DB_PORT", $DB_USER, $DB_P);

my $sql = "SELECT id_x, x_name FROM base.x";

$cmd = $DB->prepare($sql);
$cmd->execute;

while (my ($id_x, $x_name) = $cmd->fetchrow_array){
        print $fh pack("i", $id_x);
        print $fh pack("a32", $x_name); #в файл вместо русских (и только русских) символов записываются знаки вопроса.
}

$cmd->finish;

$DB->disconnect;

close ($fh);


PM MAIL   Вверх
gcc
Дата 26.9.2008, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



база в какой кодировке?
PM WWW ICQ Skype GTalk Jabber   Вверх
RETROme
  Дата 26.9.2008, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 23.9.2008

Репутация: нет
Всего: нет



gcc, smile должна быть cp1251, админы утаивают. На выходе любая, главное чтобы кириллицу поддерживала.
PM MAIL   Вверх
nitr
Дата 26.9.2008, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



RETROme, на выходе сделайте кодировку как у БД smile А админы пускай не утаивают smile
Если не скажут, то:
у вас скорее всего БД в utf-8 кодировке, на выходе тоже utf-8 сделайте и проверьте - надеюсь угадаете.


--------------------
PM   Вверх
RETROme
  Дата 26.9.2008, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 23.9.2008

Репутация: нет
Всего: нет



nitr, буду верить, что с Вашей помощью код будет удачно дописан, так как это единственная загвоздка, на которую мне пришлось наткнуться. Спасибо ;)
PM MAIL   Вверх
ramus
Дата 27.9.2008, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 21.2.2008

Репутация: 1
Всего: 1



Цитата(RETROme @  26.9.2008,  14:13 Найти цитируемый пост)
админы утаивают

Правильно утаивают smile ибо не в этом дело...
Скажу крамольную мысль: для клиента Оракла не важно в какой кодировке БД. Важно сказать серверу в какой кодировке клиент хочет получить данные. Сервер все автоматически сам сконвертирует для каждого клиента. 

Насколько я помню за этот параметр на клиенте отвечает переменная окружения NLS_LANG (ораклового)
она должна быть установлена что то типа (зависит от LANG на клиенте, но обычно так)
для клиента виндовс  NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251 
для клиента линукс   NLS_LANG=AMERICAN_AMERICA.CL8KOI8R

Хотя в DBI может быть по другому надо сообщать серверу о кодировке... это для стандартного ораклового клиента ...
Попробуйте поменять, может поможет...

код должен быть что то типа такого

Код

use DBI;

$ENV{ORACLE_HOME}="D:\\oracle\\ora92";
$ENV{NLS_LANG}="AMERICAN_CIS.CL8MSWIN1251";
$ENV{ORA_NLS33}="$ENV{ORACLE_HOME}\\ocommon\\nls\\admin\\data";



Если оракловый клиент на виндах, то обычно эти переменные окружения берутся по умолчанию из реестра. Однако я столкнулся с тем, что для 10 клиента в реестре этих данных по умолчанию нет и надо для приложения их устанавливать самостоятельно.

Более внимательно прочитал Ваш пост: У Вас знаки вопросов вместо русских букв? К сожалению Вы не указали какой клиент Виндовс или UNIX. Если UNIX (Linux) то возможно это связано с тем, что не настроен LOCALE. Проверьте, должно быть что то типа такого
$ locale
LANG=ru_RU.KOI8-R
LC_CTYPE="ru_RU.KOI8-R"
LC_COLLATE="ru_RU.KOI8-R"



Это сообщение отредактировал(а) ramus - 27.9.2008, 22:38
PM MAIL   Вверх
nitr
Дата 28.9.2008, 02:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



RETROme, если что - то тут были посты как указывать эту кодировку в Оракл - поиском можно попытаться найти.

Добавлено через 5 минут и 12 секунд
вот что дают результаты поиска:
Код
$dbh = DBI->connect ($dsn, $user, $passwd, {ora_charset => 'CL8MSWIN1251'});

и тут
http://forum.vingrad.ru/forum/topic-229626...acle/index.html

P.S.: а нужно ли это... ;)


--------------------
PM   Вверх
RETROme
  Дата 28.9.2008, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 23.9.2008

Репутация: нет
Всего: нет



nitr, огромное спасибо за помощь!

ramus, мммм smile машины UNIX'овые. Как же я забыл про $ENV, спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0509 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.