好的,这是我的设置。我正在开发一个 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 没有传递正确的字符。