gpt4 book ai didi

sql-server - Perl/DBI/DBD::ODBC 中的自动字符编码处理

转载 作者:行者123 更新时间:2023-12-02 23:10:35 26 4
gpt4 key购买 nike

我使用 Perl 和 DBI/DBD::ODBC 从 SQL Server 数据库检索数据,但在字符编码方面存在一些问题。

数据库的默认排序规则为 SQL_Latin1_General_CP1_CI_AS,因此 varchar 列中的数据采用 Microsoft 版本的 Latin-1(又称为 windows-1252)进行编码。 .

在 DBI/DBD::ODBC 中似乎没有办法透明地处理这个问题。我返回的数据仍然编码为 windows-1252,例如, € “” 被编码为字节 0x80、0x93 和 0x94。当我将它们写入 UTF-8 编码的 XML 文件而不首先对其进行解码时,它们被写入 Unicode 字符 0x80、0x93 和 0x94,而不是 0x20AC、0x201C、0x201D,这显然是不正确的。

我当前的解决方法是在每次 fetch 之后对每一列调用 $val = Encode::decode('windows-1252', $val)。这可行,但似乎不是执行此操作的正确方法。

有没有办法告诉DBIDBD::ODBC为我做这个转换?

我正在使用 ActivePerl (5.12.2 Build 1202),以及由 ActivePerl 提供的 DBI (1.616) 和 DBD::ODBC (1.29),并使用 ppm 进行更新;在托管数据库的同一服务器上运行 (SQL Server 2008 R2)。

我的连接字符串是:

dbi:ODBC:Driver={SQL Server Native Client 10.0};Server=localhost;Database=$DB_NAME;Trusted_Connection=yes;

提前致谢。

最佳答案

DBD::ODBC(和 ODBC API)不知道基础列的字符集,因此 DBD::ODBC 无法对返回的 8 位数据执行任何操作,它只能按原样返回它,您需要知道什么它是并解码它。如果将列绑定(bind)为 SQL_WCHAR/SQL_WVARCHAR,则驱动程序/sql_server 应该将字符转换为 UCS2,并且 DBD::ODBC 应该将列视为 SQL_WCHAR/SQL_WVARCHAR。当 DBD::ODBC 以 unicode 模式构建时,SQL_WCHAR 列被视为 UCS2 并以 UTF-8 解码和重新编码,Perl 应该将它们视为 unicode 字符。

您需要在bind_columns之后将SQL_WCHAR设置为绑定(bind)类型,因为绑定(bind)类型不像参数类型那样具有粘性。

如果您想继续读取以字节为单位的 1252 varchar 数据,那么目前您别无选择,只能解码它们。我并不急于向 DBD::ODBC 添加一些内容来为您执行此操作,因为这是第一次有人向我提到这一点。您可能想要查看 DBI 回调,因为在这些回调中解码返回的数据可能更容易完成(例如 fetch 方法)。

您可能还想研究较新的 SQL Server ODBC 驱动程序中的“执行字符数据翻译”设置,尽管我自己对此缺乏经验。

关于sql-server - Perl/DBI/DBD::ODBC 中的自动字符编码处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5912082/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com