0

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

我试过charset=utf8在连接字符串中指定。该文档提到了一个syb_enable_utf8 (bool)设置,但是每当我尝试这样做时,都会出现错误:

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

2 回答 2

1

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

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

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

或者

$h->{syb_enable_utf8} = 1;

您还应该阅读 pod 中描述设置 syb_enable_utf8 时会发生什么的位,因为它从仅适用于 UNIVARCHAR、UNICHAR 和 UNITEXT 列的文档中显示。

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

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

于 2011-10-05T08:40:19.080 回答
1

我发现的一个解决方案是:

use Encode qw(encode_utf8);

然后,无论您将数据写入文件还是其他任何地方,都可以使用Encode::encode_utf8($data);

$data您从 MSSQL 获取的列/值在哪里。

于 2011-10-05T04:54:48.070 回答