Как я могу обрабатывать символы не ASCII при получении данных с SQL Server с использованием Perl? - PullRequest
0 голосов
/ 31 декабря 2008

У меня есть скрипт Perl, работающий в UNIX, который использует DBI для подключения и получения данных из базы данных SQL Server. Сценарий выглядит следующим образом:

$dbh = DBI->connect("dbi:Sybase:server=$connect;charset=UTF-8", $login, $password) or die("Couldn't connect to $connect as $login/$password:
$DBI::errstr");


$sql = "use mydb";
$sth = $dbh->prepare($sql);
$sth->execute or die("execute failed");
$sth->finish;


$sql = "MyProc \@DATE='1/1/2008'";
$sth = $dbh->prepare($sql);
$sth->execute or die("execute failed");
while (($body) = $sth->fetchrow()) {
        print "$body\n";
}
$sth->finish;

$dbh->disconnect if $dbh;

Переменная body извлекает данные из столбца, который является NVARCHAR и содержит символы не ASCII. Запрос работает нормально, но оператор print выплевывает ????? когда он встречает не-ASCII символ. В DBI-> connect я даже указываю набор символов, но не повезло.

Есть мысли о том, как заставить это работать?

Ответы [ 3 ]

6 голосов
/ 31 декабря 2008

Ваш код выглядит нормально.

У меня нет оснований полагать, что то, что вы помещаете в базу данных и затем извлекаете, еще не в кодировке UTF-8.

Подтвердили ли вы, что терминал, на котором вы печатаете данные, фактически находится в режиме UTF-8?

2 голосов
/ 31 декабря 2008

О, сколько часов я потратил впустую, гоняясь за несуществующими ошибками, основываясь на том, что я видел или не видел, когда я печатал данные на свой терминал. Существует несколько различных способов проверки ваших данных, на которые не влияют непечатаемые символы, и которые не зависят от возможности отображения в вашей системе правильных глифов с кодами символов, отличных от ASCII. Если ваши данные выглядят неправильно, выведите их в файл и просмотрите файл в шестнадцатеричном редакторе или запустите их через утилиту od.

0 голосов
/ 31 декабря 2008

Я подключил Perl к SQL Server через FreeTDS + ODBC и у меня не было проблем с кодировкой символов. Может быть, виноват Sybase DBI ...

...