Firebird 2.5降级至2.1:将Similar to替换为Like实现域定义
适配Firebird 2.1的CODET域定义改写
没问题,Firebird 2.1确实不支持SIMILAR TO正则匹配,但我们可以通过LIKE结合字符范围、固定位置匹配,完全复刻你原来的所有校验逻辑。下面是改写后的完整域定义:
CREATE DOMAIN CODET AS varchar(16) NOT NULL CHECK ( char_length(value) = 16 AND value LIKE 'G[CME] [1-6] E[PSL] [A-E] [0-9][0-9] [0-9][0-9][0-9]' AND substring(value from 14 for 3) > '000' ) COLLATE NONE;
规则对应拆解
我把原SIMILAR TO的正则规则逐段转换成了Firebird 2.1LIKE支持的模式:
- 原规则第1位
[G]{1}→ 直接写G(单字符匹配,无需重复次数标记) - 原规则第2位
[C,M,E]{1}→[CME](LIKE支持方括号枚举字符,逗号可省略) - 所有空格位置直接保留在
LIKE模式中,和原规则一致 - 原规则第4位
[1-6]{1}→[1-6](LIKE支持数字范围匹配) - 原规则第6-7位
[E]{1}[P,S,L]{1}→E[PSL](固定E后接P/S/L中的任意一个) - 原规则第9位
[A-E]{1}→[A-E](LIKE支持字母范围匹配,等价于[ABCDE]) - 原规则的两位数字段
[0-9]{1}[0-9]{1}→[0-9][0-9](匹配任意两位数字) - 原规则的三位数字段
[0-9]{1}[0-9]{1}[0-9]{1}→[0-9][0-9][0-9](匹配任意三位数字)
额外注意点
- Firebird的
LIKE原生支持上述字符范围和枚举模式,完全能替代原正则的单字符校验逻辑 - 原校验中
substring(value from 14 for 3) > '000'的逻辑保持不变,因为这部分和正则无关,直接保留即可 COLLATE NONE也沿用原设置,确保字符匹配不依赖特定排序规则
内容的提问来源于stack exchange,提问作者Moh Lamine




