我们在其中一个应用程序中偶然发现了一个非常奇怪的问题。 seach引擎使用存储过程来比较一堆过滤器。但是,当插入特定类型的字符串时,sql server(2005)的行为非常奇怪。我已将问题分离到以下内容:
select 'match!' where 'teliaa' like '%telia%'
整理是丹麦语挪威语CI AS,我们的角色意思相同。这包括'aa',也意味着'å'。
任何人都可以解释为什么上述声明不会产生'匹配!'
答案 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)
的输出我无法回答你的问题...