MySQL查询带空格能查询到数据
MySQL 的尾部空格忽略规则(trailing space ignoring in string comparisons)几乎存在于所有主流 MySQL 版本中,并且是 SQL 标准兼容行为,不是某个特定版本的“bug”或“特性”。
✅ 该规则适用的 MySQL 版本范围
| MySQL 3.23(早期版本) | ✅ 存在 |
| MySQL 4.0 / 4.1 | ✅ 存在 |
| MySQL 5.0 / 5.1 / 5.5 / 5.6 / 5.7 | ✅ 存在 |
| MySQL 8.0 | ✅ 存在(默认 collation 仍为 PAD SPACE) |
| MySQL 8.0.1+ | ⚠️ 引入了非 PAD SPACE 的 collation(如utf8mb4_0900_as_cs),但默认仍使用 PAD SPACE |
🔹 结论:从 MySQL 3.x 到最新的 8.0+,只要使用的是 默认的 collation(如
utf8mb4_general_ci、utf8mb4_unicode_ci、latin1_swedish_ci等),尾部空格在比较时都会被忽略。
🔍 技术细节:为什么所有版本都这样?
这是因为 MySQL 使用的 collation(排序规则)类型决定的:
-
所有传统 collation 都是
PAD SPACE类型
根据 MySQL 官方文档 :“MySQL’s traditional collations are of type PAD SPACE. This means that trailing spaces are ignored in comparisons.”
-
只有 MySQL 8.0 引入的新 collation(基于 UCA 9.0.0)才支持
NO PAD
例如:utf8mb4_0900_ai_ci→ 仍然是 PAD SPACE ❌(注意!很多人误解)- 实际上,MySQL 8.0 中目前所有内置 collation 仍然是 PAD SPACE!
📌 重要澄清:
尽管 MySQL 8.0 支持NO PAD语义(在语法层面),但截至 MySQL 8.0.35(最新稳定版),所有内置 collation 仍然是PAD SPACE。
也就是说:即使在 MySQL 8.0,默认行为依然忽略尾部空格!
参考:MySQL 8.0 Collation Documentation
✅ 验证示例(任何版本都成立)
-- 创建测试表
CREATE TABLE test (name VARCHAR(20));
INSERT INTO test VALUES ('lisa'),('lisa '),('lisa '),('lisa '),('lisa ');
-- 查询(带空格)
SELECT * FROM test WHERE name = 'lisa ';
-- ✅ 返回所有结果(所有 MySQL 版本都如此)
🆕 未来可能的变化?
- MySQL 计划在未来版本(尚未发布)中提供真正的
NO PADcollation。 - 但截至目前(2024 年,MySQL 8.0 / 8.3 / 8.4),所有生产环境默认行为仍是忽略尾部空格。
✅ 总结
| 尾部空格忽略规则存在于哪些 MySQL 版本? | 所有主流版本(3.23 → 5.x → 8.0+) |
| 是否可以通过 collation 关闭? | ❌目前(MySQL 8.0.35)所有内置 collation 仍是 PAD SPACE |
| 如何精确匹配空格? | 使用BINARY、LENGTH()或应用层TRIM() |
💡 建议:不要依赖 MySQL 区分尾部空格。在应用层对用户输入做
trim()处理是最安全的做法。

浙公网安备 33010602011771号