我在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我甚至指定字符集,但没有运气。
关于如何让它发挥作用的任何想法?
答案 0 :(得分:6)
您的代码看起来不错。
我没有理由相信您放入数据库并随后检索的内容仍然不是UTF-8编码。
您是否确认打印数据的终端实际上处于UTF-8模式?
答案 1 :(得分:2)
哦,根据我在终端上打印数据时所看到或未看到的内容,我浪费了多少小时来追逐不存在的错误。有几种不同的方法可以验证不受非打印字符影响的数据,并且不依赖于系统的显示能够将正确的字形映射到非ASCII字符代码。如果您的数据看起来不正确,请将它们转储到文件中,然后使用十六进制编辑器浏览文件,或者通过od实用程序运行它们。
答案 2 :(得分:0)
我已将Perl连接到SQL Server via FreeTDS + ODBC并且对字符编码没有任何问题。也许Sybase DBI是罪魁祸首......