使用字符范围通配符的LIKE运算符的区分大小写检查约束

时间:2015-02-13 02:07:58

标签: sql-server tsql case-sensitive sql-like check-constraints

我正面临着正则表达式区分大小写的问题。在正则表达式表达式中,只有第一项在方括号内起作用。

create table
(
    FlowerId varchar(7)

    constraint chk_flid_regex 
    check(ActorId like'[A-Z][a-z][A-Z]' collate sql_latin1_general_CP1_CS_AS)
);

EG。如果我给这样的东西 '[A-Z] [A-Z] [A-Z]' 服务器仅检查第一个[A-Z]。未检查第三个[A-Z]。

因此,如果我插入像'Abc'这样的值,那么它实际上不会插入到表中。然而,它没有给出任何错误。它应该只接受像'AbC'这样的字符。

3 个答案:

答案 0 :(得分:3)

虽然我无法解释为什么CS排序规则不起作用,但切换到二进制排序规则似乎与您期望的一样,至少在Sql Server 2008中是这样的:

create table tbl
(
     FlowerId varchar(7)
constraint chk_flid_regex 
check(FlowerId like'[A-Z][a-z][A-Z]' collate Latin1_General_BIN)
);

Sql Fiddle

答案 1 :(得分:1)

您不能使用范围表格,您必须展开您想要使用的所有字母:

create table
(
    FlowerId varchar(7)

    constraint chk_flid_regex 
    check(ActorId like'[ABCDEFGHIJKLMNOPQRSTUVWXYZ][abcdefghijklmnopqrstuvwxyz][ABCDEFGHIJKLMNOPQRSTUVWXYZ]' collate sql_latin1_general_CP1_CS_AS)
);

或切换到二进制排序规则。为什么?因为在大多数排序规则中,小写字母放在大写字母之间,在大写字母之前或之后。所以范围A-Z扩展为AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZ - 您排除的所有内容都是小写的z


(我希望每次我必须在上面输入时,我的字母表都正确,但您可能需要仔细检查我没有错过任何字母)

答案 2 :(得分:0)

^[A-Z][a-z][A-Z]$

添加锚以禁止部分匹配。