【问题标题】:Why does end-of-line operator ($) not work in MariaDB unless I include a trailing null?为什么除非我包含尾随空值,否则行尾运算符 ($) 在 MariaDB 中不起作用?
【发布时间】:2018-09-23 13:20:04
【问题描述】:

这是感兴趣的领域:

something    VARCHAR(8)          NULL,

它可以包含非数字,但我需要选择此字段中仅包含数字的行。我尝试过使用这个正则表达式:

something RLIKE '^\\d+$'

这不匹配。但是,如果我在最后为空字节添加一个 Kleene 闭包,它就会匹配。这是匹配的表达式:

something RLIKE '^\\d+\x00*$'

我的问题是:我做错了什么吗?我应该设置一个标志吗?我在任何地方的文档中都没有看到这一点。 MariaDB 的文档没有提到用空字节填充 VARCHARs。事实上,他们文档中的一部分给我留下了我的第一个正则表达式应该有效的印象。这是文档中的引述:

此示例检查字符串是否仅包含“单词”字符:

SELECT 'abc' RLIKE '^\\w+$';
-> 1

【问题讨论】:

  • SELECT HEX(something) ... 这样我们就可以看到是否有零字节。
  • VARCHAR 使用长度字段实现,后跟字符串中的字节。它在结束时不使用零字节来终止。但是,可能您可以将其放入字符串中。
  • 例如,SELECT HEX (code) FROM UnitedNationsM49Subregions; 给了我303632
  • 等一下,这在我的 Mac 上突然起作用了。失败发生在我的 Windows 机器上。这可能与行尾有关吗?
  • 中南亚的过时代码?

标签: mariadb pcre


【解决方案1】:

您不提供版本或代码示例,但以下在 MariaDB 10.3.9 中使用默认设置:

CREATE TABLE r (x VARCHAR(8) NULL);
INSERT INTO r VALUES ('abc'),('123'),('1d3');

SELECT x RLIKE '^\\d+$' FROM r;
+------------------+
| x RLIKE '^\\d+$' |
+------------------+
|                0 |
|                1 |
|                0 |
+------------------+

https://mariadb.com/kb/en/library/server-system-variables/#default_regex_flags 有一些行为标志,但我不知道这是否与您的情况有关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多