尝试将LIKE 更改为ALIKE,并将您的通配符从* 更改为%。
Access 数据库引擎(Jet、ACE 等)有两个 ANSI Query Modes,每个 LIKE 使用不同的通配符:
ANSI-89 查询模式使用*
ANSI-92 查询模式使用%
OLE DB 始终使用 ANSI-92 查询模式。
DAO 始终使用 ANSI-89 查询模式。
Access UI 可以设置为使用其中一种。
但是,当使用 ALIKE 关键字时,通配符始终为 %,无论 ANSI 查询模式如何。
考虑一个业务规则,它规定一个数据元素必须正好包含八个数字字符。假设我按如下方式实施规则:
CREATE TABLE MyStuff
(
ID CHAR(8) NOT NULL,
CHECK (ID NOT LIKE '%[!0-9]%')
);
我不可避免地会使用% 作为通配符,因为Access 的CHAR 数据类型和CHECK 约束只能在ANSI-92 查询模式下创建。
但是,有人可以使用 DAO 访问数据库,它始终使用 ANS-89 查询模式,% 字符将被视为文字而不是“特殊”字符,并且可以执行以下代码:
INSERT INTO MyStuff (ID) VALUES ('%[!0-9]%');
插入会成功,我的数据完整性会被破坏:(
在 ANSI-89 查询模式下创建的验证规则中使用 LIKE 和 * 以及使用 ADO 连接的人(始终使用 ANSI-92 查询模式)并插入 * * 字符不应该出现的字符。
据我所知,没有办法规定使用哪种 ANSI 查询模式来访问自己的 Access 数据库。因此,我认为无论用户选择何种 ANSI 查询模式,所有 SQL 都应编码为一致的行为。
请注意,在上面的示例中使用LIKE 对两者进行编码并不难,例如
CHECK (
ID NOT LIKE '%[!0-9]%'
AND ID NOT LIKE '*[!0-9]*'
)
...或者确实完全避免使用通配符,例如
CHECK (ID LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')
但是,使用 ALIKE 将减少冗长的代码,即更容易被人类阅读,因此更容易维护。
此外,当需要移植到符合 SQL 标准的 SQL 产品时,ALIKE 也可以很好地移植,即将 ALIKE 关键字转换为 LIKE 就足够了。在解析给定的 SQL 谓词时,找到一个 LIKE 关键字比在文本文字中找到 * 字符的所有多个实例要容易得多。请记住,“可移植”并不意味着“代码将按原样运行”;相反,它是衡量在平台之间移动代码的难易程度(请记住,在同一产品的不同版本之间移动是一个端口,例如 Jet 4.0 到 ACE 是一个端口,因为用户级安全不再起作用,@987654350 @ 值的排序方式不同,等等)。