SQLite、ASCII AZ 检查约束

z64*_*z64 3 sqlite regular-expression check-constraints regex

我有下表,我试图将列“前缀”限制为 ASCII 字母字符。但是,在使用以下约束后,我仍然可以插入其他字符。为什么它不起作用?

CREATE TABLE test
(
    id INTEGER NOT NULL PRIMARY KEY, 
    prefix TEXT NOT NULL, 
    CHECK(prefix NOT LIKE '%[^a-zA-Z]%')
)
Run Code Online (Sandbox Code Playgroud)

使用 Python 的 sqlite3 包和 DB Browser for SQLite

joa*_*olo 5

LIKESQL 中的运算符不像正则表达式那样工作。与强大的正则表达式相比,此运算符允许的模式匹配非常简单。实际上,您有两个元字符%means (0 or more of anything),相当于正则.*表达式中的a,以及_meaning (1 of anything),相当于正则.表达式中的a。就是这样。

这意味着您的CHECK条件,如最初所写,实际上并未检查您的期望。它唯一会抱怨的是以下语句:

INSERT INTO test 
VALUES (37, 'hello [a-zA-Z] impossible');
Run Code Online (Sandbox Code Playgroud)

包含文字的[a-zA-Z].

您实际上可以使用REGEXP运算符并编写:

CHECK (prefix REGEXP '^[a-zA-Z]+$')
Run Code Online (Sandbox Code Playgroud)

但是,为了能够使用它,您首先需要在 Linux 机器上安装sqlite3-pcresqlite3pcre regex 扩展可能有 Windows 替代方案,但我找不到它)。您可以在 Stack Overflow 的如何在 SQLite 查询中使用正则表达式中找到更多信息和说明.


其他数据库(如 PostgreSQL)允许您使用~运算符使用 RegExp 。您可以在SQLFiddle进行检查。


SQLite 文档参考和教程: