Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Perl, DBI, чтение кириллицы из базы Oracle 9i


Автор: RETROme 26.9.2008, 12:11
Как правильно осуществить чтение русского текста из базы Oracle 9i с помощью DBI в Perl (5.8.0 версии)?

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

Автор: RETROme 26.9.2008, 12:37
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);


Автор: gcc 26.9.2008, 13:19
база в какой кодировке?

Автор: RETROme 26.9.2008, 14:13
gcc, smile должна быть cp1251, админы утаивают. На выходе любая, главное чтобы кириллицу поддерживала.

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

Автор: RETROme 26.9.2008, 15:29
nitr, буду верить, что с Вашей помощью код будет удачно дописан, так как это единственная загвоздка, на которую мне пришлось наткнуться. Спасибо ;)

Автор: ramus 27.9.2008, 21:48
Цитата(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"


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

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

и тут
http://forum.vingrad.ru/forum/topic-229626/kw-dbd-oracle-class-ооп/hl/dbi++oracle/index.html

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

Автор: RETROme 28.9.2008, 08:24
nitr, огромное спасибо за помощь!

ramus, мммм smile машины UNIX'овые. Как же я забыл про $ENV, спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)