简体   繁体   English

具有字符范围和区分大小写列的SQL Server LIKE运算符

[英]SQL Server LIKE operator with character range and case sensitive column

Can you explain me why following query returns rows which does not fulfill LIKE condition. 你能解释一下为什么后面的查询返回不符合LIKE条件的行。 Column in the table has case sensitive collation, so query shouldn't return anything. 表中的列具有区分大小写的排序规则,因此查询不应返回任何内容。

CREATE TABLE #temp (col CHAR COLLATE SQL_Latin1_General_CP1_CS_AS);
INSERT INTO #temp VALUES ('A'), ('B'), ('C'), ('D'), ('E');
SELECT * FROM #temp WHERE col LIKE '[b-d]';

Any other case sensitive collation (ie. Latin1_General_100_CS_AS, Polish_100_CS_AS, Modern_Spanish_100_CS_AS) also doesn't work correctly. 任何其他区分大小写的排序规则(即Latin1_General_100_CS_AS,Polish_100_CS_AS,Modern_Spanish_100_CS_AS)也无法正常工作。

As far as I can found only binary sort order collections (Latin1_General_100_BIN2, Modern_Spanish_100_BIN2) works well. 据我所知,只有二进制排序集合(Latin1_General_100_BIN2,Modern_Spanish_100_BIN2)才能正常工作。

This error exist only when I use range in LIKE condition. 仅当我在LIKE条件中使用范围时才会出现此错误。 When I change [bd] to [bcd] everything is OK. 当我将[bd]更改为[bcd]时一切正常。

Is it a bug in database engine? 这是数据库引擎中的错误吗?

I use Microsoft SQL Server 2008 (SP3) - 10.0.5846.0 (X64) Enterprise Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1) 我在Windows NT 6.1(Build 7601:Service Pack 1)上使用Microsoft SQL Server 2008(SP3) - 10.0.5846.0(X64)企业版(64位)

No it's not a bug. 不,这不是一个错误。

The range in the pattern syntax is not a regular expression. 模式语法中的范围不是正则表达式。 It defines a range under the collation sort order. 它定义了排序规则排序顺序下的范围。

Those collations sort AaBbCcDd...YyZz (with upper case and lower case intermingled) so this is an expected result. 那些排序规则排序AaBbCcDd...YyZz (大写和小写混合),这是一个预期的结果。

Binary collations sort AB .... YZ .... ab ... yz (with upper case and lower case separated) which is why it works correctly for those. 二进制排序规则排序AB .... YZ .... ab ... yz (大写和小写分隔)这就是为什么它适用于那些。

To show the order of the example you posted in your answer: 要显示您在答案中发布的示例的顺序:

CREATE TABLE #temp (col CHAR);
INSERT INTO #temp VALUES ('A'), ('B'), ('C'), ('D'), ('E'), ('a'), ('b'), ('c'), ('d'), ('e');
-- This will work (ABCDEabcde):
SELECT * FROM #temp ORDER BY col COLLATE Latin1_General_BIN
-- These will order letters:
SELECT * FROM #temp ORDER BY col COLLATE Latin1_General_100_CS_AS
SELECT * FROM #temp ORDER BY col COLLATE Polish_100_CS_AS
SELECT * FROM #temp ORDER BY col COLLATE Modern_Spanish_100_CS_AS
SELECT * FROM #temp ORDER BY col COLLATE SQL_Latin1_General_CP1_CS_AS

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM