1

好的,这是我的设置。我正在开发一个 PHP 应用程序,它位于 linux 操作系统上。我正在尝试将数据传递到 Windows 操作系统,传递到 SQL Server 数据库。我使用 Freetds 作为提供者,因为似乎每个人都使用它来从 Linux 机器与 SQL Server 进行通信。我正在使用 ADODB,它是 PHP 的数据库抽象库。

我还在开发一个结帐系统,允许用户选择现有的数百个国家中的任何一个,并输入该国家的州或省。我获取了所有这些数据,并且必须将其传递给第三方系统,这就是我之前谈到的 SQL Server 实例。

问题是,用户正在为他们的州/国家输入带有特殊字符的数据,例如ö。我花了几个小时才发现它不是 PHP,我的应用程序,我的代码,因为特殊字符在过程的所有点都正确出现,即使在调试 adodb 方法中传递给存储过程参数的内容时也是如此。问题出在 FreeTDS 中,因为我发现我需要将以下行添加到我的 freetds.conf

client charset = UTF-8

这似乎有效,我非常高兴它实际上不是我的代码,而只是配置文件中的一行。在我的任务在 Jira 关闭后进行进一步测试,我认为我再也不必担心这个问题了,我收到一封电子邮件,说嘿,这不适用于罗马尼亚各州。因此,似乎并非所有特殊字符都被正确传递。

我对字符集不是很了解,我确实读过每个开发人员都应该知道的 Joels Absolute Minimum

罗马尼亚的一个州不起作用的一个例子是Și la o răspântie cu statui我认为Ș问题在于性格。在 SQL 服务器上运行查询时,它只是将其转换为 S。在 php 中执行并通过 freetds 发送时,它会返回此错误消息

The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Parameter 9 ("@in_state_name"): Data type 0xA7 has an invalid data length or metadata length.

在进行查询之前,我已经尝试过设置SET names UTF8和其他一些设置,但我再次认为问题出在它甚至到达查询之前 freetds 没有传递正确的字符。

4

1 回答 1

1

问题是当前数据库只接受 varchar 而不是 nvarchar,所以我必须让第三方支持 nvarchar 或进行某种类型的映射以获得 ascii 等效项。

于 2011-09-07T11:59:43.563 回答