[Moscow.pm] FreeTDS, MSSQL и кодировка (Aliaksandr Zahatski)

Павел Купцов pavel на kuptsov.info
Вт Дек 18 03:31:25 PST 2012


Нашел частичное решение:
$dbh->{odbc_utf8_on} = 1;

Но почему-то работает не для всех полей...
Почему - не понятно.
К примеру выборка вроде такой:
SELECT
          t0.DocNum,
          (CASE WHEN t1.CardFName IS NULL THEN t0.CardName ELSE
t1.CardFName END) AS CardName,
          .....
          t0.DocCur
    FROM dbo.OINV t0
....

выдает поле CardName - нормально, а DocCur - крякозябра.
При этом типы полей одинаковые nvarchar, только длины разные ( 15 и 3)

и запросы типа:
...
CASE WHEN var=300 THEN N'такое-то'
...
возвращает криво (значения от THEN) ...

Вот такой DSN не проходит:
$DSN = 'Sybase:server=192.168.0.1;database=MYDATABASE;packetSize
=8192;language=us_english;charset=iso_1';

у меня DSN построен так (в конфиге)
 dsn => 'dbi:ODBC:MSSQL7',
в скрипте
my $dbh = DBI->connect("$cfg->{db}{dsn}", $cfg->{db}{uid},$cfg->{db}{pwd},
{ PrintError=>1, RaiseError => 1}) or die "$DBI::errstr\n";

MSSQL7 - имя odbc-коннекта из odbc.ini

чарсет в именно DSN не получается впихнуть (да и он указан в ini вроде бы).



> Приветствую !
>
> По своему опыту использования подобного подключения, был
> существенный минус: не работает с  бинарными полями ( по крайней мере
> 8 лет назад).
>
> кодировку можно указать в DSN, но использовалась следующая:
>   $DSN = 'Sybase:server=192.168.0.1;database=MYDATABASE;packetSize
> =8192;language=us_english;charset=iso_1';
>
> размер ответов по умолчанию мал:
>       $dbh->{LongReadLen} = 5000000;
>
> ответ $DBI::errstr в кодировке windows-1251 (для русской версии), поэтому:
>       encodeToUTF8( 'windows-1251',  $DBI::errstr );
>
> приходилось по  делать:
>   decode( 'utf8', $str ) unless utf8::is_utf8($str)
>
>
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20121218/0c85c068/attachment.html>


Подробная информация о списке рассылки Moscow-pm