SQLite,ASCII 字符 0x20 到 0x7E 检查约束
SQLite, ASCII Characters 0x20 to 0x7E Check Constraint
我有以下 table,其中我试图将列 "name" 限制为范围从 0x20 到 0x7E 的 ASCII 字符(所有 printable ASCII 字符)。为什么我的检查约束不起作用?
CREATE TABLE test
(
id INTEGER NOT NULL,
name TEXT NOT NULL CHECK(name NOT GLOB '*[^\x20-\x7E]*'),
PRIMARY KEY(id)
)
例如:
INSERT INTO test (name) VALUES("Tom");
预期:应将名称为 "Tom" 的元组添加到 table(因为插入的名称仅包含 printable ASCII 字符)。结果:CHECK containt failed: test
反斜杠在 SQL 字符串中并不特殊。例如,'\x20' 是 4 个单独的字符,而不是转义的单个字符。所以你的 GLOB
模式总是匹配(因为 T 不是集合中的字符),并且 NOT
使它成功,因此约束失败。
我有以下 table,其中我试图将列 "name" 限制为范围从 0x20 到 0x7E 的 ASCII 字符(所有 printable ASCII 字符)。为什么我的检查约束不起作用?
CREATE TABLE test
(
id INTEGER NOT NULL,
name TEXT NOT NULL CHECK(name NOT GLOB '*[^\x20-\x7E]*'),
PRIMARY KEY(id)
)
例如:
INSERT INTO test (name) VALUES("Tom");
预期:应将名称为 "Tom" 的元组添加到 table(因为插入的名称仅包含 printable ASCII 字符)。结果:CHECK containt failed: test
反斜杠在 SQL 字符串中并不特殊。例如,'\x20' 是 4 个单独的字符,而不是转义的单个字符。所以你的 GLOB
模式总是匹配(因为 T 不是集合中的字符),并且 NOT
使它成功,因此约束失败。