区分大小写不起作用

Nie*_*jes 1 sql-server collation sql-server-2016 string-searching

我遇到一个问题,我不断从下面的查询中获取值“CtP_PETER_Fact”。它应该是区分大小写的 where 子句。我尝试了几种不同的方法:在选择中的“Where ObjectName”之后、正则表达式之后设置 COLLATE 语句,并使用排序规则创建列。我不断得到我意想不到的输出。也许是我的正则表达式有问题?我也对正则表达式进行了很多实验,但似乎无法让它发挥作用。

IF OBJECT_ID('tempdb..#nameFacts') IS NOT NULL
DROP TABLE #nameFacts;


CREATE TABLE #nameFacts (


    objectname varchar(200) COLLATE SQL_Latin1_General_CP1_CS_AS,
    ObjectType varchar(40)

)


insert into #nameFacts (objectname, ObjectType)
values
 ('BPD_Inslap_Fact','Fact')
,('CTP_HENK_FACT','Fact')
,('CTP_PETER_Fact','Fact')
,('CTP_PETER_FACT','Fact')
,('CtP_PETER_Fact','Fact')
,('C0P_PETER_Fact','Fact')
,('C0P_PETER_FACT','FACT')


SELECT *
FROM #nameFacts
WHERE
ObjectName --COLLATE SQL_Latin1_General_CP1_CS_AS 
            LIKE '[A-Z0-9][A-Z][A-Z][_][A-Z][A-Z][A-Z][A-Z][A-Z][_][F][a][c][t]' --COLLATE SQL_Latin1_General_CP1_CS_AS


IF OBJECT_ID('tempdb..#nameFacts') IS NOT NULL
DROP TABLE #nameFacts;
Run Code Online (Sandbox Code Playgroud)

我不断收到下面的输出,我不希望得到值“CtP_PETER_Fact”。我使用的是 SQL Server 2016 SP2 CU 17。

输出

Pau*_*ite 7

[A-Z]是一个字符范围。范围内的字符取决于排序顺序

\n
SELECT \n    SV.number, \n    CHAR(SV.number) \nFROM master.dbo.spt_values AS SV\nWHERE \n    SV.[type] = \'P\'\n    AND SV.number BETWEEN 1 AND 255\n    AND CHAR(SV.number) COLLATE SQL_Latin1_General_CP1_CS_AS LIKE \'[A-Z]\'\nORDER BY \n    CHAR(SV.number) COLLATE SQL_Latin1_General_CP1_CS_AS ASC;\n
Run Code Online (Sandbox Code Playgroud)\n

db<>fiddle 在线演示

\n

部分输出:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n
数字(无列名)
65A
97A
193\xc3\x81
225\xc3\xa1
224\xc3\xa0
192\xc3\x80
194\xc3\x82
226\xc3\xa2
196\xc3\x84
228\xc3\xa4
......
\n
\n

正如您所看到的,许多您可能意想不到的字符被定义为在该范围内排序。

\n

要仅匹配某些大写字母,您需要:

\n
[ABCDEFGHIJKLMNOPQRSTUVWXYZ]\n
Run Code Online (Sandbox Code Playgroud)\n

或者使用排序规则,其中 AZ 范围的排序顺序符合您的要求,例如Latin1_General_100_BIN2

\n

排序规则的区分大小写或不区分大小写的部分仅影响相等比较。LIKE \'[A]\'在不区分大小写的排序规则下将匹配 \'a\' 和 \'A\',但在区分大小写的排序规则下仅匹配 \'A\'。

\n