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。
[A-Z]
是一个字符范围。范围内的字符取决于排序顺序:
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\n部分输出:
\n数字 | (无列名) |
---|---|
65 | A |
97 | A |
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[ABCDEFGHIJKLMNOPQRSTUVWXYZ]\n
Run Code Online (Sandbox Code Playgroud)\n或者使用排序规则,其中 AZ 范围的排序顺序符合您的要求,例如Latin1_General_100_BIN2
。
排序规则的区分大小写或不区分大小写的部分仅影响相等比较。LIKE \'[A]\'
在不区分大小写的排序规则下将匹配 \'a\' 和 \'A\',但在区分大小写的排序规则下仅匹配 \'A\'。
归档时间: |
|
查看次数: |
576 次 |
最近记录: |