Обработка специальных символов при извлечении данных из MS SQL Server с использованием Perl DBD - PullRequest
0 голосов
/ 05 октября 2011

У меня есть база данных MS SQL Server 2008, из которой я получаю данные, используя модуль perl DBD :: Sybase.Но в БД есть некоторые специальные символы, такие как символ авторского права, символ торговой марки и т. Д., Которые не импортируются должным образом.Кажется, Perl меняет все эти специальные символы на символы Вопросительного знака.Есть ли способ исправить это?

Я попытался указать charset=utf8 в строке подключения.В doc упоминается настройка syb_enable_utf8 (bool), но всякий раз, когда я пытаюсь это сделать, я получаю сообщение об ошибке:

Can't locate object method "syb_enable_utf8" via package "DBI::db"

Ответы [ 2 ]

1 голос
/ 05 октября 2011

Я нашел одно решение:

use Encode qw(encode_utf8);

Затем, где бы вы ни записывали данные в файл или где-либо еще, используйте Encode::encode_utf8($data);

, где $data - столбец/ значение, которое вы получили из MSSQL.

0 голосов
/ 05 октября 2011

Я не использую DBD :: Sybase, но а) я использую много других DBD и б) в настоящее время я собираю информацию о поддержке юникода в DBD.В соответствии с модулем вам нужен как минимум OpenClient 15.x при использовании syb_enable_utf8.Вы используете 15.x или позже?Возможно, syb_enable_utf8 не определен, если ваш клиент меньше 15.x или у вас слишком старая версия DBD :: Sybase.К сожалению, я не могу видеть из файла Changes, когда был добавлен syb_enable_utf8.

Однако, когда вы говорите «не могу найти метод», я думаю, что это подсказка, поскольку syb_enable_utf8 - это не метод, а атрибут (находится под определенными Атрибутами Sybase) в стручке.Поэтому вам нужно добавить его к вашему соединению или установить его через дескриптор соединения, например:

my $h = DBI->connect("dbi:Sybase:something","user","password", {syb_enable_utf8 => 1});

или

$h->{syb_enable_utf8} = 1;

Вы также должны прочитать биты в модуле, описывающие, чтопроисходит, когда значение syb_enable_utf8 установлено так, как оно указано в документах, которые применяются только к столбцам UNIVARCHAR, UNICHAR и UNITEXT.

Наконец, прежде всего необходимо правильно вставить данные.Я предполагаю, что если он не вставлен из Perl с syb_enable_utf8 и charset = utf8, а ваши данные не являются правильными символами юникода в Perl, то перед вставкой вы получите мусор обратно.

В комментарии Raze2dust ничего не былосправиться с проблемой, но стоит обратить внимание, если вы собираетесь записывать данные, полученные из вашей базы данных в другом месте.Просто не забудьте декодировать любой ввод данных в ваш скрипт и кодировать любой вывод данных.

...