4

这个查询:

select *
from op.tag
where tag = 'fussball'

返回一个标签列值为“fußball”的结果。列“标签”定义为 nvarchar(150)。

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

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

select 1 
where 'fußball' = 'fussball'

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

select 1 
where 'fußball' = cast('fussball' as nvarchar)

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

select 1 
where cast('fußball' as varchar) = cast('fussball' as varchar)

我很困惑。

4

5 回答 5

3

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

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

语言敏感的搜索和匹配与排序密切相关。在某些强度级别上比较相等的字符串是在进行语言敏感匹配时应该匹配的字符串。例如,在初级强度中,根据 UCA,“ß”将与“ss”匹配,而在 UCA 的丹麦剪裁中,“aa”将匹配“å”。

于 2010-02-16T19:47:12.163 回答
2

SELECT确实返回带有排序规则 Latin1_General_CI_AS (SQL2000) 的行。

它不使用排序规则 Latin1_General_BIN。

您可以通过在 N/VARCHAR 之后使用 COLLATE < collat​​ion > 关键字为表列分配排序规则。

您还可以使用以下语法将字符串与特定排序规则进行比较

string1 = string2 COLLATE < collation >
于 2010-02-16T19:56:08.120 回答
2

这不是解释行为的答案,但可能是相关的:

这个问题中,我了解到使用排序规则

Latin1_General_Bin 

将避免大多数排序规则的怪癖。

于 2010-02-16T21:01:11.030 回答
1

一些帮助答案 - 不是您问题的完整答案,但仍然可能有帮助:

如果你试试:

SELECT 1 WHERE N'fußball' = N'fussball'  

你会得到“1”——当使用“N”来表示 Unicode 时,这两个字符串被认为是相同的——为什么会这样,我还不知道。

要查找服务器的默认排序规则,请使用

SELECT SERVERPROPERTY('Collation')

要查找数据库中给定列的排序规则,请使用以下查询:

SELECT
  name 'Column Name', 
  OBJECT_NAME(object_id) 'Table Name', 
  collation_name
FROM sys.columns
WHERE object_ID = object_ID('your-table-name') 
AND name = 'your-column-name'
于 2010-02-16T19:56:36.950 回答
1

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

select 1 where 'fußball' = cast('fussball' as nvarchar)

在这里,您正在处理 SQL Server 数据类型优先规则,如Data Type Precedence中所述。比较总是使用较高优先级的类型进行:

当运算符组合不同数据类型的两个表达式时,数据类型优先级规则指定将具有较低优先级的数据类型转换为具有较高优先级的数据类型。

由于 nvarchar 的优先级高于 varchar,因此示例中的比较将使用 nvarchar 类型进行,因此它实际上与(即使用 Unicode 类型)完全相同select 1 where N'fußball' =N'fussball'。我希望这也能说明为什么您的最后一个案例没有返回任何行。

于 2010-02-16T22:59:56.217 回答