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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не корректная кодировка DBI oracle, при выгрузке из oracle кривая кодировка 
:(
    Опции темы
pirojok
Дата 17.6.2010, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день.

Нужна помощь, по работе с БД Oracle 10 из PERl.
Делаю выборку из БД oracle средствами perl.
Запрос следующий:
Код

select "OPERATOR", count("NUMBER") as count,
REGEXP_REPLACE(dbms_lob.substr(a."DESCRIPTION",100,1),'(Reassignment from) (.*) to','\2',1,1,'m') as komanda
from activitym1 a 
where
sysmodtime between
                   TO_DATE('01.01.2010 00:00','DD.MM.YYYY hh24:mi')-substr(sessiontimezone,3,1)/24
               and TO_DATE('04.05.2010 23:59','DD.MM.YYYY hh24:mi')-substr(sessiontimezone,3,1)/24
group by "OPERATOR", REGEXP_REPLACE(dbms_lob.substr(a."DESCRIPTION",100,1),'(Reassignment from) (.*) to','\2',1,1,'m')



В результате поле komanda вместо названий на русском языке выдаёт квадратик.
Причём сама выборка из perl делается не корректно, т.е. он фактически делает группировку по этому КВАДРАТИКУ(он во всех полях одинаковым получается).

Вероятно проблема в переменных клиента, но в каких, понять не могу.


При этом, в девелопере этот запрос отрабатывает корректно.
Если не использовать REGEXP_REPLACE, то проблем нет. Русские символы отображаются корректно.

Кусок кода отвечающий за выборку:


Код

#!/usr/bin/perl
use DBI;

#Объявляем переменные
my $user='123';
my $password='123';

#Конект к БД
my $source="dbi:Oracle:host=12.34.56.123;sid=SIDDB;port=1521";
my $dbh=DBI->connect($source,$user,$password,{PrintError=>0,AutoCommit=>0,RaiseError=>1) 
or die "Couldnot connect to Oracle:$DBI::errstr\n"; 
$dbh->do("ALTER SESSION SET  NLS_DATE_FORMAT='DD-MM-YY HH24:MI'");

sub get_data
{
my ($start, $end)=@_; 
my @out, %TMP;

my $sql=qq(select "OPERATOR", count("NUMBER") as count,
REGEXP_REPLACE(dbms_lob.substr(a."DESCRIPTION",100,1),'(Reassignment from) (.*) to','\2',1,1,'m') as komanda
from activitym1 a 
where
sysmodtime between
                   TO_DATE('01.01.2010 00:00','DD.MM.YYYY hh24:mi')-substr(sessiontimezone,3,1)/24
               and TO_DATE('04.05.2010 23:59','DD.MM.YYYY hh24:mi')-substr(sessiontimezone,3,1)/24
group by "OPERATOR", REGEXP_REPLACE(dbms_lob.substr(a."DESCRIPTION",100,1),'(Reassignment from) (.*) to','\2',1,1,'m')
); 
my $sql_request=$dbh->prepare($sql);
my $result=$sql_request->execute || die "Error while to execute the $sql";
while(my %RESULT=%{$sql_request->fetchrow_hashref})
                                {
                                push @out,\%RESULT; 
                                #DEBUG))
                                print "$RESULT{DE} $RESULT{OPERATOR} $RESULT{COUNT}<br>\n";
                          
                                }
 return @out;
 }


PM MAIL   Вверх
vadiml
Дата 18.6.2010, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Что-то я не увидел где Вы указываете в какой кодировке будет общение с базой

Any data returned from Oracle to DBD::Oracle in the AL32UTF8 character set will be marked as UTF-8 to ensure correct handling by Perl.
For Oracle to return data in the AL32UTF8 character set the NLS_LANG or NLS_NCHAR environment variable must be set as described in the previous section.
When fetching NCHAR, NVARCHAR, or NCLOB data from Oracle, DBD::Oracle will set the Perl UTF-8 flag on the returned data if either NLS_NCHAR is AL32UTF8, or NLS_NCHAR is not set and NLS_LANG is AL32UTF8.
When fetching other character data from Oracle, DBD::Oracle will set the Perl UTF-8 flag on the returned data if NLS_LANG is AL32UTF8.
http://search.cpan.org/~pythian/DBD-Oracle...cle_and_Unicode

Аналогично и для других кодировок, только нет заморочек с флагом utf8.
PM MAIL Jabber   Вверх
pirojok
Дата 18.6.2010, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо за ответ.
Пробую вот так:
my $dbh=DBI->connect($source,$user,$password,{PrintError=>0,AutoCommit=>0,RaiseError=>1, ora_charset => 'CL8MSWIN1251'}) 

результат тот же

Может я не правильно вас понял?
PM MAIL   Вверх
Pilat66
Дата 19.6.2010, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



может что-то типа
$ENV{NLS_LANG}="AMERICAN_AMERICA.UTF8";

PM MAIL   Вверх
pirojok
Дата 21.6.2010, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Pilat66 @  19.6.2010,  18:38 Найти цитируемый пост)
$ENV{NLS_LANG}="AMERICAN_AMERICA.UTF8";


Так вообще не выбирает ни чего...

PM MAIL   Вверх
TTT
Дата 25.6.2010, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


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

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


 




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


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

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