如何解决Oracle SQL Developer数据类型为char5的字符数限制
我受命用可变组码实现一个表。有几个要求。
- char(5)
- 2或4个大写字母加上1个数字,其值在1到4之间(例如,AA1,AABB1)
- 任何禁止输入违反第1点和第2点的输入
我唯一能想到的就是regexp_like,但是我的努力却徒劳无功
create table Test(
groupcode char(5) check(
regexp_like(groupcode,'^[A-Z]{2}[0-9]$','c')
)
);
INSERT INTO Test(groupcode) VALUES ('AA1');
我插入了这个,但是它一直告诉我有一些违规,我不理解。
我指定^
和$
是因为我不希望出现'bbAA1'
或'AA1bb'
之类的东西。
我也接受非正则表达式解决方案。在今天下午完成所有工作之后,我开始怀疑自己的做法。
解决方法
您的正则表达式^[A-Z]{2}[0-9]$
仅允许(完全)三个字符。但是,如果定义为char(5)
的列少于三个,则会填充空格,因此实际上'AA1'
将存储为'AA1 '
,这违反了您的正则表达式。
改为使用char(3)
。
更好的是,根本不要使用char
(您刚刚经历了原因之一),同时使用varchar(5)
或varchar(3)
都可以与您的正则表达式一起使用。
2或4个大写字母加1个数字,其值介于1-4之间
这不是您的正则表达式所做的。 [A-Z]{2}
恰好是两个大写字母。如果要允许使用不同长度的模式,则除非您在正则表达式中也包含空格,否则无法使用char(5)
:
create table test
(
groupcode char(5) check(
regexp_like(groupcode,'(^[A-Z]{2}[0-9] $)|(^[A-Z]{4}[0-9]$)','c'))
);
上述正则表达式允许两个大写字符后跟一个数字和两个空格 四个大写字符后跟一个数字。
,我建议:
CREATE TABLE Test (
groupcode VARCHAR(5),CONSTRAINT (CHECK(REGEXP_LIKE(groupcode,'^[A-Z]{2}([A-Z]{2})?[1-4]$','c')))
);
以下是正则表达式模式的说明:
^ from the start of the column
[A-Z]{2} match AA,AB,BB,etc.
([A-Z]{2})? then match another optional AA,etc.
[1-4] match 1-4
$ end of the column
Demo
后期编辑:@Horse答案正确指出您应该在此处使用VARCHAR
。但是您的正则表达式也有问题,我已解决。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。