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_ciutf8mb4_unicode_cilatin1_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 PAD collation。
  • 但截至目前(2024 年,MySQL 8.0 / 8.3 / 8.4),所有生产环境默认行为仍是忽略尾部空格

✅ 总结

尾部空格忽略规则存在于哪些 MySQL 版本? 所有主流版本(3.23 → 5.x → 8.0+)
是否可以通过 collation 关闭? 目前(MySQL 8.0.35)所有内置 collation 仍是 PAD SPACE
如何精确匹配空格? 使用BINARYLENGTH()或应用层TRIM()

💡 建议:不要依赖 MySQL 区分尾部空格。在应用层对用户输入做 trim() 处理是最安全的做法

posted @ 2025-03-19 10:46  Journey&Flower  阅读(3)  评论(0)    收藏  举报