SQL'Like'运算符和'aa'

时间:2009-07-23 12:50:41

标签: sql sql-server-2005 internationalization

我们在其中一个应用程序中偶然发现了一个非常奇怪的问题。 seach引擎使用存储过程来比较一堆过滤器。但是,当插入特定类型的字符串时,sql server(2005)的行为非常奇怪。我已将问题分离到以下内容:

select 'match!' where  'teliaa' like '%telia%'

整理是丹麦语挪威语CI AS,我们的角色意思相同。这包括'aa',也意味着'å'。

任何人都可以解释为什么上述声明不会产生'匹配!'

3 个答案:

答案 0 :(得分:2)

排序规则不会自动将“aa”与“å”匹配。

这将确保“å”正确排序,而其他一些东西,但它不会替代同样适用德语中的“ss”vs“ß”,例如

您必须以某种方式清理数据。

SELECT REPLACE ('teliå', 'å', 'aa'), /* ...or  */REPLACE ('teliaa', 'aa', 'å')

编辑,2013年5月

我猜测å与该排序规则中的aa不匹配。 但它确实排序正确

DECLARE @foo TABLE (bar varchar(2))
INSERT @foo VALUES ('Ab'),('Aa'),('aa'), ('å'), ('Za');

SELECT * FROM @foo ORDER BY bar COLLATE Danish_Norwegian_CI_AS;

SELECT * FROM @foo WHERE bar COLLATE Danish_Norwegian_CI_AS = 'Aa';
SELECT * FROM @foo WHERE bar COLLATE Danish_Norwegian_CI_AS = 'a';
SELECT * FROM @foo WHERE bar COLLATE Danish_Norwegian_CI_AS = 'å';

答案 1 :(得分:0)

排序规则是用于比较字符的规则集合,对排序最有用。有人说它只影响排序,这不完全正确。来自https://technet.microsoft.com/en-us/library/aa174903%28v=sql.80%29.aspx

  

SQL Server排序规则定义数据库引擎如何存储和操作字符和Unicode数据。

例如,在Danish_Norwegian口音麻木不仁的校对中将'aa'与'å'相匹配。以'aa'开头的名称与以'å'开头的名称一起排序。但是,它也会影响比较和LIKE运算符。以下是一些说明这一点的查询字符串。

select 'match!' where  'teliaa' collate Latin1_General_100_CI_AI like '%telia%' --yields "match!"
select 'match!' where  'teliaa' collate Latin1_General_100_CI_AS like '%telia%' --yields "match!"
select 'match!' where  'teliaa' collate Latin1_General_100_CS_AI like '%telia%' --yields "match!"
select 'match!' where  'teliaa' collate Latin1_General_100_CS_AS like '%telia%' --yields "match!"

select 'match!' where  'teliaa' collate Danish_Norwegian_CI_AI like '%telia%' --no rows
select 'match!' where  'teliaa' collate Danish_Norwegian_CI_AS like '%telia%' --no rows
select 'match!' where  'teliaa' collate Danish_Norwegian_CS_AI like '%telia%' --no rows
select 'match!' where  'teliaa' collate Danish_Norwegian_CS_AS like '%telia%' --no rows

select 'match!' where  'teliaa' collate Danish_Norwegian_CI_AI like '%å%' --yields "match!"
select 'match!' where  'teliaa' collate Danish_Norwegian_CI_AS like '%å%' --no rows
select 'match!' where  'teliaa' collate Danish_Norwegian_CS_AI like '%å%' --yields "match!"
select 'match!' where  'teliaa' collate Danish_Norwegian_CS_AS like '%å%' --no rows

根据您的需要,如果您需要将“aa”与“å”匹配,请将它们视为相同,然后在查询或数据存储/列中选择支持此选项的排序规则。如果没有,则选择类似Latin1_General_100_CI_AI的排序规则。

答案 2 :(得分:-2)

select 'match!' where  'teliaa' like '%telia%'

给'匹配!'作为我的sql-2008(SP1)10.0.2531.0(x64)

的输出

我无法回答你的问题...