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



你能解释一下为什么以下查询返回不满足 LIKE 条件的行吗?表中的列具有区分大小写的排序规则,因此查询不应返回任何内容。

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]';

任何其他区分大小写的排序规则(即Latin1_General_100_CS_AS、Polish_100_CS_AS Modern_Spanish_100_CS_AS) 也无法正常工作。

据我所知,只有二进制排序顺序集合(Latin1_General_100_BIN2、Modern_Spanish_100_BIN2)运行良好。

仅当我在 LIKE 条件下使用范围时,此错误才存在。当我将 [b-d] 更改为 [bcd] 时,一切都很好。

这是数据库引擎中的错误吗?

我在 Windows NT 6.1 上使用Microsoft SQL Server 2008 (SP3) - 10.0.5846.0 (X64) 企业版(64 位)(内部版本 7601:Service Pack 1)

不,

这不是错误。

模式语法中的范围不是正则表达式。它在排序规则排序顺序下定义一个范围。

这些排序规则AaBbCcDd...YyZz排序(大写和小写混合在一起),因此这是预期结果。

二进制排序规则AB .... YZ .... ab ... yz排序(大写和小写分开),这就是为什么它可以正确用于这些排序规则的原因。

要显示您在答案中发布的示例的顺序,请执行以下操作:

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

最新更新