SQL 整理语句 where 子句
SQL Collate statement where clause
我正在尝试在 SQL Server 2008 R2 中进行以下查询。在处理重音敏感度时,我发现了这一点:
select case when 'Наина' = '毛泽东先生' then 'Match' else 'No Match' end col
我看到的结果是:
'Match'
这种行为的可能原因是什么?我也尝试过使用 COLLATE
和不同的口音,但没有用。
您应该在比较中使用 NVARCHAR
。经检查,使用 VARCHAR
:
时,两个字符串都转换为 '?????'
SELECT *
FROM (VALUES
(N'Наина', 'Наина'),
(N'毛泽东先生', '毛泽东先生')
)t([NVACRHAR], [VARCHAR])
以上查询结果:
NVACRHAR VARCHAR
-------- -------
Наина ?????
毛泽东先生 ?????
所以,为了达到想要的效果,必须使用NVARCHAR
:
select
case
when 'Наина' = '毛泽东先生' then 'Match'
else 'No Match'
end match_VARCHAR,
case
when N'Наина' = N'毛泽东先生' then 'Match'
else 'No Match'
end match_NVARCHAR
编辑:我真的没有真正的解释,以上只是我测试的结果。另一个答案可能会更好地解释这一点。
我正在尝试在 SQL Server 2008 R2 中进行以下查询。在处理重音敏感度时,我发现了这一点:
select case when 'Наина' = '毛泽东先生' then 'Match' else 'No Match' end col
我看到的结果是:
'Match'
这种行为的可能原因是什么?我也尝试过使用 COLLATE
和不同的口音,但没有用。
您应该在比较中使用 NVARCHAR
。经检查,使用 VARCHAR
:
'?????'
SELECT *
FROM (VALUES
(N'Наина', 'Наина'),
(N'毛泽东先生', '毛泽东先生')
)t([NVACRHAR], [VARCHAR])
以上查询结果:
NVACRHAR VARCHAR
-------- -------
Наина ?????
毛泽东先生 ?????
所以,为了达到想要的效果,必须使用NVARCHAR
:
select
case
when 'Наина' = '毛泽东先生' then 'Match'
else 'No Match'
end match_VARCHAR,
case
when N'Наина' = N'毛泽东先生' then 'Match'
else 'No Match'
end match_NVARCHAR
编辑:我真的没有真正的解释,以上只是我测试的结果。另一个答案可能会更好地解释这一点。