Автоматическая обработка кодировки символов в Perl / DBI / DBD :: ODBC - PullRequest
4 голосов
/ 06 мая 2011

Я использую 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;

Заранее спасибо.

1 Ответ

3 голосов
/ 06 мая 2011

DBD :: ODBC (и ODBC API) не знает набор символов нижележащего столбца, поэтому DBD :: ODBC не может ничего делать с возвращенными 8-битными данными, он может только вернуть его как есть, и вам нужно знать, что это и расшифровать. Если вы связываете столбцы как SQL_WCHAR / SQL_WVARCHAR, драйвер / sql_server должен преобразовать символы в UCS2, а DBD :: ODBC должен видеть столбцы как SQL_WCHAR / SQL_WVARCHAR. Когда DBD :: ODBC построен в режиме Unicode, столбцы SQL_WCHAR обрабатываются как UCS2 и декодируются и перекодируются в UTF-8, и Perl должен видеть их как символы Unicode.

Вам необходимо установить SQL_WCHAR в качестве типа связывания после bind_columns, так как типы связывания не похожи на типы параметров.

Если вы хотите продолжить чтение ваших данных varchar, которые в Windows 1252 являются байтами, то в настоящее время у вас нет другого выбора, кроме как их декодировать. Я не тороплюсь добавлять что-то в DBD :: ODBC, чтобы сделать это для вас, так как это первый раз, когда кто-то упомянул это мне. Возможно, вы захотите взглянуть на обратные вызовы DBI, так как декодирование возвращаемых данных может быть проще в них (скажем, метод выборки).

Возможно, вы захотите исследовать параметр «Выполнять перевод для символьных данных» в новых драйверах ODBC для SQL Server, хотя у меня самого небольшой опыт работы с ним.

...