Почитайте доки к DBD::ODBC, там есть про Unicode и поддержка зависит от версии и от драйвера FreeTDS.
2012/12/18 Павел Купцов <[email protected]> > Нашел частичное решение: > $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) >> >> > -- > Moscow.pm mailing list > [email protected] | http://moscow.pm.org > > -- Best regards, Ruslan.
-- Moscow.pm mailing list [email protected] | http://moscow.pm.org
