Informix 12.10的 CLOB与正则表达式问题?

编程语言 2026-07-09

我在几台Windows服务器上运行Informix 12.10。 我有一个简单的表。为了便于说明,以下述为例。我存储一个名字、几个数字、MIME类型、实际的文件/媒体,以及一个CLOB列来描述字节列中包含的内容。

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
);

我想用正则表达式来搜索CLOB列。我使用的正则表达式在下面的两个SQL查询中。这个正则表达式很简单。我理解 [[:<:]][[:>:]] 是单词边界。我用它来避免错误匹配。根据IBM的文档:

[t]he Informix Regex extension支持基于POSIX 1003.2标准的扩展正则表达式,以及基本正则表达式

并且它使用Henry Spencer的正则表达式库。我也尝试使用 \bmark\b 来标记单词边界。虽然没有报错,但在我知道它至少应有一次匹配时,结果仍然没有任何匹配。在SQL中,我选择了要搜索的列,以及 regex_match 表达式来查看结果。这条SQL查询是在我创建更复杂的查询之前,对概念的一个简单测试,以便于

select clobcol, regex_match(clobcol, "[[:<:]]mark[[:>:]]", 3)
from attachments
where clobcol is not null;

select clobcol, regex_match(clobcol, "[[:<:]]mark[[:>:]]", 3)
from attachments
where 
    clobcol is not null
    and regex_match(clobcol, "[[:<:]]mark[[:>:]]", 3);

当我执行这些SQL查询时,这两个查询都会产生执行错误。我在dbaccess和 DBeaver中都运行过,使用两者时得到相同的结果。

错误如下。

Error occurred during SQL query execution
SQL Error [URXA1]: freezeset: Assert failed in regcomp.c at 1760: expression: cs2->sorted.

SQL Error [URXA1]: freezeset: Assert failed in regcomp.c at 1760: expression: cs2->sorted.
  freezeset: Assert failed in regcomp.c at 1760: expression: cs2->sorted.

我正在尝试在CLOB中进行不区分大小写的单词匹配,只匹配单词mark(此处为示例)。换句话说,我想匹配“mark”、“Mark”、“mArk”,但不匹配“market”和“marks”。

有没有修复这个bug的办法,甚至是一个变通办法?CLOB的搜索能力有限,我还没能用把所有内容转换为大写或小写再进行比较的常规技巧来判断是否匹配。

解决方案

同事给了我一个找到变通办法的线索。我想把它贴在这里,以防有其他人遇到类似问题需要答案。我用Google搜索了正则表达式中单词边界类的替代方案。这些是Google的 AI提出的替代方案。我测试过,效果不错。

对于单词边界的起始部分 ('[[:<:]]'),将其替换为 '(^|[^[:alnum:]])'。这会搜索行的起始位置,或者一个不属于字母数字类且不是下划线 ('') 的字符。

对于单词边界的结束部分 ('[[:>:]]'),将其替换为 '([^[:alnum:]]|$)'。这会搜索该单词在行尾,或者一个不属于字母数字类且不是下划线 ('') 的字符。

把两者拼起来,你就得到如下查询。

SELECT clobcol, regex_match(clobcol, "(^|[^[:alnum:]_])mark([^[:alnum:]_]|$)", 3) as is_match
FROM attachments
where 
    clobcol is not null
    and regex_match(clobcol, "(^|[^[:alnum:]_])mark([^[:alnum:]_]|$)", 3);

看起来这个错误只是与在CLOB数据类型中对单词边界类的处理有关。我测试过,确实有效。我不确定是否百分之百正确,但在我的测试中,它似乎确实匹配了我需要的所有相关值。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章