Informix 12.10中CLOB正则表达式查询报错问题求助
解决Informix 12.10中CLOB列的单词边界正则匹配问题
问题背景
在Windows服务器的Informix 12.10环境中,对包含CLOB列的attachments表执行POSIX单词边界正则匹配时遇到异常:
- 使用
[[:<:]]mark[[:>:]]作为正则表达式时触发URXA1断言错误(报错信息:freezeset: Assert failed in regcomp.c at 1760: expression: cs2->sorted) - 使用
\bmark\b无报错但无匹配结果 - 由于CLOB列限制,无法通过
UPPER(clobcol) LIKE '%MARK%'这类常规大小写转换方法实现独立单词匹配需求
表结构如下:
CREATE TABLE attachments ( name char(15) NOT NULL, num integer NOT NULL, repnum integer NOT NULL, attachmentnum integer NOT NULL, mimetype char(126), media byte, clobcol clob, PRIMARY KEY (name,num,repnum,attachmentnum) CONSTRAINT xpkattachments );
报错原因分析
该断言错误是Informix 12.10版本中Henry Spencer正则库在Windows环境下的已知兼容性问题,核心是字符排序规则与正则库的预期不匹配,导致处理CLOB列时触发断言失败。
修复与替代方案
方案1:使用非单词字符替代单词边界
避开POSIX原生的[[:<:]]/[[:>:]]边界符,改用基于非单词字符的匹配逻辑,同时通过正则标志实现大小写不敏感:
SELECT clobcol, regex_match(clobcol, '(^|[^a-zA-Z0-9])mark([^a-zA-Z0-9]|$)', 3) FROM attachments WHERE clobcol IS NOT NULL AND regex_match(clobcol, '(^|[^a-zA-Z0-9])mark([^a-zA-Z0-9]|$)', 3);
(^|[^a-zA-Z0-9])匹配字符串开头或非单词字符,替代左单词边界([^a-zA-Z0-9]|$)匹配非单词字符或字符串结尾,替代右单词边界- 参数
3对应REG_ICASE标志,实现大小写不敏感匹配
方案2:升级Informix版本
该正则库兼容性问题在Informix 14.10及后续版本中已被修复,升级到最新稳定版后可直接使用原生POSIX单词边界语法:
SELECT clobcol, regex_match(clobcol, '[[:<:]]mark[[:>:]]', 3) FROM attachments WHERE clobcol IS NOT NULL AND regex_match(clobcol, '[[:<:]]mark[[:>:]]', 3);
方案3:临时转换CLOB为字符类型(限短内容)
若无法升级版本,可将CLOB列转换为LVARCHAR类型后再匹配,适用于CLOB内容长度不超过LVARCHAR最大限制的场景:
SELECT clobcol, regex_match(CAST(clobcol AS LVARCHAR(32767)), '[[:<:]]mark[[:>:]]', 3) FROM attachments WHERE clobcol IS NOT NULL AND regex_match(CAST(clobcol AS LVARCHAR(32767)), '[[:<:]]mark[[:>:]]', 3);
注意:此方法仅适用于CLOB内容长度在
LVARCHAR支持范围内的情况,过长内容会被截断导致匹配失效。
内容的提问来源于stack exchange,提问作者Joe McCay
相关产品推荐
相关产品推荐

