Unicode 字符导致 SQL Server 2005 字符串比较出现问题

The*_*edi 5 sql-server unicode collation string-comparison

这个查询:

\n\n
select *\nfrom op.tag\nwhere tag = \'fussball\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

返回标签列值为“fu\xc3\x9fball”的结果。列“tag”定义为 nvarchar(150)。

\n\n

虽然我知道它们在语法上是相似的词,但有人可以解释和捍卫这种行为吗?我认为它与相同的排序规则设置相关,这些设置允许您更改列/表的区分大小写,但谁会想要这种行为?当由于违反约束而存在另一个值时,列上的唯一约束也会导致一个值的插入失败。我该如何关闭此功能?

\n\n

后续加分问题。解释一下为什么这个查询不返回任何行:

\n\n
select 1 \nwhere \'fu\xc3\x9fball\' = \'fussball\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

额外问题(答案?):@ScottCher 私下向我指出,这是由于字符串文字“fussball”被视为 varchar。此查询确实返回结果:

\n\n
select 1 \nwhere \'fu\xc3\x9fball\' = cast(\'fussball\' as nvarchar)\n
Run Code Online (Sandbox Code Playgroud)\n\n

但话又说回来,这个没有:

\n\n
select 1 \nwhere cast(\'fu\xc3\x9fball\' as varchar) = cast(\'fussball\' as varchar)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我很困惑。

\n

djc*_*djc 3

我猜你的连接/表/数据库的 Unicode 排序规则集指定 ss == \xc3\x9f。后一种行为可能是因为它位于错误的快速路径上,或者可能进行了二进制比较,或者可能您没有以正确的编码传递 \xc3\x9f (我同意这是愚蠢的) )。

\n\n

http://unicode.org/reports/tr10/#Searching提到 U+00DF 是特殊情况。这是一个富有洞察力的摘录:

\n\n
\n

语言敏感的搜索和匹配与排序规则密切相关。在某个强度级别上比较为相等的字符串是在进行语言敏感匹配时应该匹配的字符串。例如,在主要强度下,根据 UCA,“\xc3\x9f”\n 将与“ss”匹配,而“aa”将在丹麦语剪裁中匹配“\xc3\xa5” UCA。

\n
\n