我有一个带有UK Postcode(英国邮政编码)字段的表,我将使用正则表达式测试不良格式,即使基本测试也无法正常工作。
我的值为CM8 2AX。
如果我跑步
从sor.party_person中选择邮政编码,其中'CM8 2AX'〜'。* [0-9] [A-Z] [A-Z] $'
and post_code ='CM8 2AX';
我知道
CM8 2AX
(1行)
这似乎表明我非常简单的正则表达式对于该值是正确的。
但是,如果我现在直接从数据库中测试相同的值-似乎是有效的查询,并已通过and条件证明这是字段中的值:
从sor.party_person中选择邮政编码,其中post_code〜'。* [0-9] [A-Z] [A-Z] $'和post_code ='CM8 2AX';
(0行)
它不匹配。
我想念什么?
如果我删除$末尾,它确实起作用,这意味着db在字段字符的末尾看到了不同的东西,并且没有将最后一个文本字符识别为最后一个字符,但这对我来说是没有意义的。
答案 0 :(得分:1)
我认为该列的数据类型导致在邮政编码后的空格处添加空格字符,这在执行=时会被忽略,但在进行正则表达式匹配时显然不会被添加。
select post_code from sor.party_person where post_code ~ '.*[0-9][A-Z][A-Z] *$' and post_code = 'CM8 2AX';
应该证明这是正确的。
修改
我的判断是正确的,但显然不是=
工作的原因。 SQL标准说,比较两个不等长的字符串时,将填充较短的字符串。因此,post_code = 'CM8 2AX'
实际上是在进行比较之前将'CM8 2AX'
填充到post_code列的长度。