我可以在哪里配置(如果可能的话) Sql Server 2005 如何“解释”通过 TDS 协议发送的字符串数据的字符编码(在本例中是来自 Web 应用程序)?
也许我描述一下整个问题情况会更好:
- 当插入区域字符如:ą、Ą、ć、Ł、ź(等等 - 波兰区域字符)时,通过 TDS 协议 - 来自 Web 应用程序的“INSERT INTO”查询,它们在 mssql 表中显示为:a(而不是 ą)、A(而不是 Ą)、c、L、z 等。
- 目标列类型为 nvarchar(MAX)
- 我查看了通过电线发送的数据(使用 WireShark),所有数据都使用 UTF-16 编码发送,看起来没问题:例如 Ą 作为 U+0104 发送。
- 当将相同的字符串插入本地数据库实例(Microsoft SQL Server Express Edition)时,它可以正常工作,但在远程主机上(在客户位置 - 它是 Microsoft SQL Server Standard Edition 64 位)会发生这种“去区域化”。这就是为什么我认为这完全与 SQL Server 配置有关,因为与 Web 应用程序端的唯一区别是选择其他 SQL 服务器(因此 TDS 驱动程序、配置、连接设置等都是相同的)。
我希望有人能帮助我解决这个问题。
答案1
我找到了这个问题的根源。它是 Unicode 字符串文字的 N 前缀:
“当 SQL Server 将不带 N 前缀的 Unicode 字符串从 Unicode 转换为 SQL Server 数据库的代码页时,Unicode 字符串中任何在 SQL Server 代码页中不存在的字符都将丢失。”
http://support.microsoft.com/kb/239530
我认为 sqlserver 的本地实例以某种方式将所有传入的字符串文字视为 Unicode 字符串,而远程服务器则不然,因此需要 N 前缀。
也许这是一个严重的错误(不知道 N 前缀的必要性),但我每天使用的是 mysql 而不是 mssql。