使用Perl DBD从MS SQL Server获取数据时的特殊字符处理

使用Perl DBD从MS SQL Server获取数据时的特殊字符处理,perl,sql-server-2008,encoding,dbi,dbd,Perl,Sql Server 2008,Encoding,Dbi,Dbd,我有一个MS SQL Server 2008数据库,使用perl DBD::Sybase模块从中获取数据。但数据库中存在一些特殊字符,如版权符号、商标符号等,这些字符没有正确导入。Perl似乎将所有这些特殊字符都更改为问号字符。有办法解决这个问题吗 我已尝试在连接字符串中指定charset=utf8。其中提到了一个syb\u enable\u utf8(bool)设置,但每当我尝试此设置时,都会出现一个错误: Can't locate object method "syb_enable_utf8

我有一个MS SQL Server 2008数据库,使用perl DBD::Sybase模块从中获取数据。但数据库中存在一些特殊字符,如版权符号、商标符号等,这些字符没有正确导入。Perl似乎将所有这些特殊字符都更改为问号字符。有办法解决这个问题吗

我已尝试在连接字符串中指定
charset=utf8
。其中提到了一个
syb\u enable\u utf8(bool)
设置,但每当我尝试此设置时,都会出现一个错误:

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

我找到的一个解决方案是:

use Encode qw(encode_utf8);
然后,无论您在哪里向文件或其他任何地方写入数据,请使用
Encode::Encode_utf8($data)


其中,
$data
是您从MSSQL获取的列/值。

我不使用DBD::Sybase,但a)我使用了许多其他DBD,b)我目前正在收集有关DBD中unicode支持的信息。根据pod,在使用syb_enable_utf8时,您至少需要OpenClient 15.x。您使用的是15.x还是更高版本?如果您的客户端小于15.x,可能没有定义syb_enable_utf8,或者您的DBD::Sybase版本太旧。不幸的是,当添加syb_enable_utf8时,我无法从更改文件中看到

然而,当你说“找不到方法”时,我认为这是一个线索,因为syb_enable_utf8不是一个方法,它是pod中的一个属性(在Sybase特定属性下)。因此,您需要将其添加到连接呼叫中,或通过如下连接句柄进行设置:

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

您还应该读取pod中的位,这些位描述了当syb_enable_utf8设置为仅适用于UNIVARCHAR、UNICHAR和UNITEXT列的文档中显示的syb_enable_utf8时会发生什么

最后,首先需要确保正确插入数据。我猜,如果不是使用syb_enable_utf8和charset=utf8从Perl中插入,并且在插入之前,您的数据不是Perl中正确的unicode字符,那么您将得到垃圾

Raze2dust的评论与您的问题无关,但如果您打算将从数据库检索到的数据写入其他地方,则值得注意。只需记住对脚本中的任何数据输入进行解码,并对任何数据输出进行编码。

请确保您已阅读以下内容:
$h->{syb_enable_utf8} = 1;