Я использую Perl с DBI
/ DBD::ODBC
для извлечения данных из базы данных SQL Server, и у меня возникают некоторые проблемы с кодировкой символов.
База данных имеет параметры сортировки по умолчанию SQL_Latin1_General_CP1_CI_AS
,поэтому данные в столбцах varchar кодируются в версии Microsoft Latin-1, AKA windows-1252
.
Кажется, что нет способа прозрачно обработать это в DBI / DBD:: ODBC.Я получаю обратно данные, все еще закодированные как windows-1252
, например, € ”закодированы как байты 0x80, 0x93 и 0x94.Когда я записываю их в XML-файл в кодировке UTF-8, не декодируя их в первую очередь, они записываются в виде символов Unicode 0x80, 0x93 и 0x94 вместо 0x20AC, 0x201C, 0x201D, что, очевидно, неверно.Обходной путь должен вызывать $val = Encode::decode('windows-1252', $val)
в каждом столбце после каждого fetch
.Это работает, но вряд ли кажется правильным способом сделать это.
Разве нет способа сказать DBI
или DBD::ODBC
сделать это преобразование для меня?
I 'm используя ActivePerl (5.12.2 Build 1202), с DBI
(1.616) и DBD::ODBC
(1.29), предоставленными ActivePerl и обновленными с помощью ppm;работает на том же сервере, на котором размещена база данных (SQL Server 2008 R2).
Моя строка подключения:
dbi:ODBC:Driver={SQL Server Native Client 10.0};Server=localhost;Database=$DB_NAME;Trusted_Connection=yes;
Заранее спасибо.