【发布时间】:2020-04-14 09:49:04
【问题描述】:
这是我的 SQL 代码:
CREATE TABLE country (
id serial NOT NULL PRIMARY KEY,
name varchar(100) NOT NULL CHECK(name ~ '^[-\p{L} ]{2,100}$'),
code varchar(3) NOT NULL
);
注意name 属性中的regex 约束。上面的代码将产生ERROR: invalid regular expression: invalid escape \ sequence。
我尝试使用转义CHECK(name ~ E'^[-\\p{L} ]{2,100}$'),但再次导致ERROR: invalid regular expression: invalid escape \ sequence。
我也知道,如果我这样做 CHECK(name ~ '^[-\\p{L} ]{2,100}$'), 或 CHECK(name ~ E'^[-\p{L} ]{2,100}$'), - SQL 将收到错误的正则表达式,因此在插入有效数据时会引发约束冲突。
PostgreSQL 正则表达式约束不支持正则表达式模式 (\p) 或类似的东西吗?
编辑#1
正则表达式 ^[-\p{L} ]{2,100}$ 基本上允许 2-100 个字符之间的国家名称,允许的字符是连字符、空格和所有字母(包括拉丁字母)。
注意: SQL 在创建表期间运行良好,但在插入有效数据时会抛出错误。
补充说明:我使用的是 PostgreSQL 12.1
【问题讨论】:
-
Edit 问题并解释模式应该匹配的内容。
-
\p{L}匹配任何字母,使用 POSIX 字符类[:alpha:]可能会得到相同的行为,试试'^[-[:alpha:] ]{2,100}$' -
postgresql.org/docs/current/…
XQuery character class elements using \p{UnicodeProperty} or the inverse \P{UnicodeProperty} are not supported.。我读到:“不 - 不支持”。 -
@stickybit 我编辑了问题并解释了模式
标签: sql regex postgresql constraints