为何MySQL 8.0 CHECK约束中等价正则表达式校验失败?
问题根因
这是MySQL 8.0早期版本的已知bug,和你写的正则逻辑对错没有关系:
- 首先可以确定:
^1*$和^1{0,}$在标准正则语义、MySQL普通SELECT查询的REGEXP匹配逻辑里是完全等价的,你单独执行查询返回匹配成功的结果是完全正确的。 - 本地部署实例和在线测试环境运行结果不一致,核心原因是两者的MySQL小版本不同:
- 在线测试环境用的是8.0.25及之后的修复版本,这类正则解析bug已经被官方处理完成
- 你自己部署的实例属于8.0.16到8.0.24之间的早期8.0版本:这个版本段的MySQL在处理CHECK约束里的正则时,没法正确识别
{m,n}格式的重复量词,会错误把符合规则的值判定为违反约束,和正则实际的匹配逻辑没有关联。
- 你可以直接在本地实例执行
select version();查看版本号,只要落在上述区间,就能完全对应上这个问题。
解决方案
- 临时绕过:写CHECK约束的时候,暂时用
*、+这类简写量词代替{0,}、{1,}这类花括号写法的等量词,就不会触发这个解析bug。 - 彻底解决:把本地的MySQL 8.0升级到8.0.25及之后的正式稳定版,官方在8.0.25的更新日志里明确标注修复了CHECK约束中正则花括号量词解析错误的问题。
内容的提问来源于stack exchange,提问作者klapeyron
相关产品推荐
相关产品推荐

