Perl TDS 字符集

Perl TDS 字符集

我正在使用 FreeTDS 驱动程序和 DBD::Sybase 连接到 MS SQL Server。当我查询某些记录的某些值时,出现此错误:

DBD::Sybase::st fetchrow_arrayref failed: OpenClient message: LAYER = (0) ORIGIN = (0) SEVERITY = (9) NUMBER = (99)
Server , database 
Message String: WARNING! Some character(s) could not be converted into client's character set. Unconverted bytes were changed to question marks ('?').

这似乎发生在包含特殊 Windows 字符集字符(例如从人们的 Outlook 和 Word 消息中复制和粘贴的花括号)的记录中。

不幸的是,我无法控制这个数据库;显然,清理输入是可行的方法,但我无法做到。

我需要更改哪些 FreeTDS 设置才能成功查询这些记录?

附加信息:

查询在 tsql 中运行良好。我仅通过 Perl 的 DBD::Sybase 接口收到此错误。(我应该通过其他方式进行测试吗?我还没有安装 PHP 或 Python 的专业知识。我有 jTDS 并且可以使用它,但我认为那是一个完全不同的实现,而不是 FreeTDS 的接口。)

添加

client charset = UTF-8

我的 freetds.conf 文件导致“内存不足!”打印到 STDERR。

答案1

我最近遇到了类似的问题。

在您的 freetds.conf 文件中,您将需要一个类似于以下内容的条目:

[DataSourceName]
        host = <IP Address>
        port = <databaseport>
        #version 8.0 seems to work  with sql server 2005
        tds version = 8.0
        client charset = UTF-8

客户端字符集是这里最重要的部分。

我在 Linux 上使用 Perl 执行此操作,我认为 UTF-8 也是这里的最佳选择,因为 Perl 是客户端

答案2

检查这是否有帮助(来自 Sybase 手册,但也可能适用于 MSSQL 服务器):

在会话期间控制角色转换

set char_convert 允许用户决定在特定工作会话期间字符集转换如何运行。使用 set char_convert 可以:

* Set character set conversion on or off

* Start conversion into a specific character set

* Turn error reporting on or off

set char_convert 的语法是:

设置 char_convert {关闭 |
{打开[带有{error | no_error}]} | charset [带有{error | no_error}]}

相关内容