使用Perl从SQL Server检索数据时如何处理非ASCII字符?

时间:2008-12-30 21:23:46

标签: sql-server perl dbi

我在UNIX上运行的Perl脚本使用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 个答案:

答案 0 :(得分:6)

您的代码看起来不错。

我没有理由相信您放入数据库并随后检索的内容仍然不是UTF-8编码。

您是否确认打印数据的终端实际上​​处于UTF-8模式?

答案 1 :(得分:2)

哦,根据我在终端上打印数据时所看到或未看到的内容,我浪费了多少小时来追逐不存在的错误。有几种不同的方法可以验证不受非打印字符影响的数据,并且不依赖于系统的显示能够将正确的字形映射到非ASCII字符代码。如果您的数据看起来不正确,请将它们转储到文件中,然后使用十六进制编辑器浏览文件,或者通过od实用程序运行它们。

答案 2 :(得分:0)

我已将Perl连接到SQL Server via FreeTDS + ODBC并且对字符编码没有任何问题。也许Sybase DBI是罪魁祸首......