MariaDB与MySQL LIKE匹配差异:_a%为何匹配结尾为a的字符串?
为什么MariaDB中
LIKE '_%a'匹配结尾为a的字符串,而非课程所说的_a%的行为? 首先得明确:你遇到的差异核心原因不是数据库版本或系统的问题,而是你实际使用的通配符模式和课程中讲解的模式,在结构上完全相反,匹配逻辑自然天差地别。
1. 课程中_a%模式的匹配逻辑
_a%的规则是按顺序生效的:
_:匹配任意单个字符(必须存在且仅有一个)a:匹配字面量字符a%:匹配任意数量的字符(包括0个)
这个模式会精准匹配**第二个字符是a**的字符串,比如:
- "abacus"(第二个字符是a)
- "banana"(第二个字符是a)
- "xabc"(第二个字符是a)
2. 你实际使用的_%a模式的匹配逻辑
而你写的_%a,通配符顺序完全颠倒了:
_:匹配任意单个字符(字符串至少有一个开头字符)%:匹配任意数量的中间字符(可以是0个)a:匹配结尾的字面量字符a
所以这个模式会匹配**长度≥2,且最后一个字符是a**的所有字符串,比如:
- "ba"(开头任意字符,无中间字符,结尾a)
- "banana"(开头b,中间nan,结尾a)
- "xxxa"(开头x,中间xx,结尾a)
这就是为什么你得到的是所有结尾为a的结果——模式结构的差异直接决定了匹配范围。
3. 快速验证MariaDB的通配符行为
你可以用下面的测试SQL确认这个逻辑:
-- 创建测试表并插入数据 CREATE TABLE test_names (name VARCHAR(20)); INSERT INTO test_names VALUES ('apple'), ('banana'), ('cherry'), ('date'), ('abacus'), ('ba'), ('a'); -- 测试课程中的_a%模式 SELECT name FROM test_names WHERE name LIKE '_a%'; -- 预期结果:abacus、banana(第二个字符是a的字符串) -- 测试你使用的_%a模式 SELECT name FROM test_names WHERE name LIKE '_%a'; -- 预期结果:banana、ba、abacus(长度≥2且结尾为a的字符串)
执行后你会看到两个查询的结果完全不同,这也验证了模式顺序对匹配结果的决定性影响。
内容的提问来源于stack exchange,提问作者Lethargos
相关产品推荐
相关产品推荐

