gpt4 book ai didi

oracle - REGEXP_LIKE 中的 CHR(0)

转载 作者:行者123 更新时间:2023-12-02 11:44:08 27 4
gpt4 key购买 nike

我正在使用查询来检查 chr(0) 在 regexp_like 中的行为方式。

CREATE TABLE t1(a char(10));
INSERT INTO t1 VALUES('0123456789');
SELECT CASE WHEN REGEXP_LIKE(a,CHR(0)) THEN 1 ELSE 0 END col, DUMP(a)
FROM t1;

我得到的输出是这样的 -

col                     dump(a)
----------- -----------------------------------
1 Typ=96 Len=10: 48,49,50,51,52,53,54,55,56,57

我完全困惑了,如果没有如转储(a)所示的 chr(0),regexp_like 如何在列中找到 chr(0) 并返回 1?这里不应该返回0吗?

最佳答案

CHR(0) 是 C 编程语言(以及其他语言)中用于终止字符串的字符。

当您将 CHR(0) 传递给该函数时,它将依次将其传递给较低级别​​的函数,该函数将解析您传入的字符串并从该字符串构建正则表达式模式。此正则表达式模式将看到 CHR(0) 并认为它是字符串终止符并忽略模式的其余部分。

使用REGEXP_REPLACE更容易看到该行为:

SELECT REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' )
FROM DUAL;

运行此命令时会发生什么:

  • CHR(0) 被编译为正则表达式并成为字符串终止符。
  • 现在模式只是字符串终止符,因此模式是零长度字符串。
  • 然后将正则表达式与输入字符串进行匹配,并读取第一个字符 a 并发现可以在 a 之前匹配零长度字符串,因此将其替换a 之前没有与 d 匹配的内容,给出输出 da
  • 然后,它将重复下一个字符,将 b 转换为 db
  • 依此类推,直到到达字符串末尾,此时它将与零长度模式匹配并附加最后的 d

你会得到输出:

dadbdcd_ded

(其中 _ 是 CHR(0) 字符。)

注意:输入中的 CHR(0) 不会被替换。

如果您使用的客户端程序也在 CHR(0) 处截断字符串,您可能看不到完整的输出(这是您的客户端如何表示字符串的问题,而不是Oracle 的输出),但也可以使用 DUMP() 显示:

SELECT DUMP( REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' ) )
FROM DUAL;

输出:

Typ=1 Len=11: 100,97,100,98,100,99,100,0,100,101,100

[TL;DR]那么发生了什么

REGEXP_LIKE( '1234567890', CHR(0) )

它将创建一个零长度字符串正则表达式模式,并在 1 字符之前查找零长度匹配 - 它将找到该匹配,然后返回已找到匹配项。

关于oracle - REGEXP_LIKE 中的 CHR(0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37461369/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com