LINUX.ORG.RU

DBI, ошибка, набор символов

 , ,


0

1

Как поменять кодировку или локаль для DBI? Ругается на что-то, но вот на что - не понять.

[Tue Apr 16 14:22:08 2013] [error] DBI connect('dbname=mg;host=127.0.0.1','game',...) failed: �����:  о��ав�ие�� �ло�� подкл��ений за�езе�ви�ован� дл� подкл��ений ��пе�пол�зова�ел� (не дл� �еплика�ии) at /usr/lib/perl5/site_perl/5.16.0/Rose/DB.pm line 965.
★★★★★

Последнее исправление: cetjs2 (всего исправлений: 1)

У DBI нет локали.
У тебя система в одной локали - в юникоде, а СУБД отдаёт в другой, прозреваю 1251. То есть надо поменять локаль либо системы, либо СУБД.

Кстати, 2cyr это абракадабру перевёл в другую, уже похожую на человеческий язык:
: ОАВИЕ ЛО ПОДЛЕНИЙ ЗАЕЗЕВИОВАН ДЛ ПОДЛЕНИЙ ПЕПОЛЗОВАЕЛ (НЕ ДЛ ЕПЛИАИИ)

Кстати 2cyr говорит что это ISO8859-5.

Xellos ★★★★★
()
Последнее исправление: Xellos (всего исправлений: 1)

�����: о��ав�ие�� �ло�� подкл��ений за�езе�ви�ован� дл� подкл��ений ��пе�пол�зова�ел� (не дл� �еплика�ии

Это UTF-8, подвергшийся перекодированию latin1 -> utf8. Чтобы прочесть, перекодируйте этот поток байт из utf8 в latin1.

Проблема тут в том, что ошибки в $! попадают уже локализованные, но не как набор символов, а как набор байт. Когда Perl пытается напечатать его в STDOUT, которому кто-то сделал binmode :utf8 или :encoding(utf8), ему ничего не остаётся, как ещё раз закодировать байты в UTF-8. Отсюда и кракозябры.

AITap ★★★★★
()
Ответ на: комментарий от bvn13

Похоже единственный способ - $dbh->do(q{SET CLIENT_ENCODING TO 'UTF8'});
Ничего похожего на $ENV{NLS_LANG} я не нашёл.

Xellos ★★★★★
()
Последнее исправление: Xellos (всего исправлений: 1)
Ответ на: комментарий от bvn13

а какой выход?

Когда достанете оригинальное сообщение об ошибке - будем думать. После копирования на ЛОР оно испортилось, поэтому декодируется не полностью. Если не можете сами, выложите его в base64.

AITap ★★★★★
()
Ответ на: комментарий от Xellos

В latin1 нет русских букв.

Что не мешает взять текст в UTF-8 и, посчитав его текстом в latin1, подвергнуть перекодированию в UTF-8. Естественно, на выходе будет мусор.

AITap ★★★★★
()
Ответ на: комментарий от bvn13

Держите:

[Fri Apr 12 12:43:56 2013] [error] DBD::Pg::st execute failed: ??????:  нет доступа к отношению settings_str at line 60.
CONTEXT:  ??????? PL/Perl "create_new_user_object" at /home/bvn13/develope/_perl/Game/Pasha/game/script/../lib/CGame/Server.pm line 262.
[Tue Apr 16 14:22:08 2013] [error] DBI connect('dbname=mg;host=127.0.0.1','game',...) failed: ВАЖНО:  оставшиеся слоты подключений зарезервированы для подключений суперпользователя (не для репликации) at /usr/lib/perl5/site_perl/5.16.0/Rose/DB.pm line 965.
[Tue Apr 16 16:32:27 2013] [error] DBD::Pg::st execute failed: ОШИБКА:  функция mgdata.clear_user_quests(unknown) не существует
LINE 1: select mgdata.clear_user_quests($1);
               ^
HINT:  Функция с данными именем и типами аргументов не найдена. Возможно, вам следует добавить явные преобразования типов. at /home/bvn13/develope/_perl/Game/Pasha/game/script/../lib/CGame/Server.pm line 194.

Часть ошибок пришлось перекодировать даже дважды (iconv -t latin 1 | iconv -t latin1//TRANSLIT | less).

AITap ★★★★★
()
Ответ на: комментарий от bvn13

Нет, двумя командами: iconv -t latin1 <filename> (3 вида ошибок) и iconv -t latin1 <filename> | iconv -t latin1//TRANSLIT (ещё 1 вид ошибок).

AITap ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.