powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl и DBD::Oracle - вопрос по правильной локализации сообщений об ошибках
3 сообщений из 3, страница 1 из 1
Perl и DBD::Oracle - вопрос по правильной локализации сообщений об ошибках
    #39010574
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такой perl-скрипт:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
use utf8;
binmode(STDIN, ':utf8');
binmode(STDOUT,':utf8');
binmode(STDERR,':utf8');

my $sql = "insert into tmp (scope, id, value) values ('test', :val1, :val2)";
my $arg = {':val1'=>10, ':val2'=>"АБВ"};

$ENV{'NLS_LANG'} = "RUSSIAN_CIS.AL32UTF8";
my $dbh = DBI->connect(..., {PrintError=>1, RaiseError=>0});

my $sth = $dbh->prepare($sql);
$sth->bind_param($_, $arg->{$_}) foreach (keys(%$arg));
$sth->execute();



Сам файл скрипта в UTF-8, в БД данные сохраняются правильно, считываются тоже правильно.
В части работы с данными с БД проблем нет.
Проблемы есть в случае если при выполнении кода возникает ошибка:
Код: plaintext
DBD::Oracle::st execute failed: ORA-00001: ???°NNN?µ???? ????N?°????N?µ?????µ N???????°?»N????NN?? (DBD ERROR: OCIStmtExecute) [for Statement "insert into tmp (scope, id, value) values ('test', :val1, :val2)" with ParamValues: :val1=10, :val2="A
Тут ответ сервера нечитаем. Да и параметр :val2, который я задавал в UTF-8, почему-то тоже не полностью выведен.

Если не переводить консоль в UTF-8, закомментировав строки с binmode, то получаю такой результат:
Код: plaintext
DBD::Oracle::st execute failed: ORA-00001: нарушено ограничение уникальности (DBD ERROR: OCIStmtExecute) [for Statement "insert into tmp (scope, id, value) values ('test', :val1, :val2)" with ParamValues: :val1=10, :val2="?
Тут ответ сервера читается.
Но :val2 не читается.
И самое главное — в этом случае я не могу выводить в консоль unicode-символы, буду получать предупреждения Wide character.

Частично проблема нивелируется, если вместо RUSSIAN_CIS выставить язык ENGLISH или EN_UK.
В этом случае сообщения сервера приходят на английском языке и не портятся.
Но может быть можно как-то сообщить DBD::Oracle, что бы он выводимые сообщения преобразовывал в текущую локаль?

________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
Perl и DBD::Oracle - вопрос по правильной локализации сообщений об ошибках
    #39010905
scrip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кракозябры из-за того, что у строки исключения кодировка UTF-8, но не установлен внутренний флаг is_utf8.
Что странно, так как в строке $DBI::errstr флаг устанавливается.

КМК, но глобально это не поменять.
Надо ловить исключение и либо делать utf8::decode($@), либо заменять на errstr
...
Рейтинг: 0 / 0
Perl и DBD::Oracle - вопрос по правильной локализации сообщений об ошибках
    #39010964
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... Не хотел связываться с обработкой исключений.
Что-ж, спасибо, попробую навесить свои обработчики исключений.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl и DBD::Oracle - вопрос по правильной локализации сообщений об ошибках
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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