between查询包含边界值但易因字段类型、顺序或时间精度出错;下限必须≤上限,否则返回空;not between不包含null,需显式处理;务必用explain验证索引及手动测试边界。

BETWEEN 查询结果包含边界值,但容易因字段类型、顺序或时间精度出错,不是写对语法就一定返回数据。
WHERE子句里直接用BETWEEN必须保证下限 ≤ 上限
如果写成 WHERE created_at BETWEEN '2026-08-10' AND '2026-08-01',MySQL不会报错,但永远返回空结果——因为没有日期能同时 ≥ 2026-08-10 且 ≤ 2026-08-01。
- 数值、字符串、日期都适用这条规则;
- 动态生成范围时(比如前端传参),务必在应用层校验
start_date ; - MySQL 不会自动交换两个值的位置,它严格按你写的顺序解释。
日期字段用BETWEEN要小心时间部分
BETWEEN '2026-08-01' AND '2026-08-05' 在 DATE 类型字段上没问题,但在 DATETIME 或 TIMESTAMP 上实际等价于 >= '2026-08-01 00:00:00' AND ,会漏掉 8 月 5 日全天的数据。
- 想查“8 月 1 日到 8 月 5 日全天”,应写成
BETWEEN '2026-08-01 00:00:00' AND '2026-08-05 23:59:59'; - 更稳妥的做法是避开
BETWEEN,改用created_at >= '2026-08-01' AND created_at ; - 如果字段是
VARCHAR存的日期(比如'2026/08/01'),BETWEEN可能隐式转换失败或走全表扫描。
字符串比较依赖排序规则(collation)
name BETWEEN 'A' AND 'M' 看似简单,但结果取决于字段的 collation:
- 如果是
utf8mb4_0900_as_cs(大小写敏感),'apple'不会被匹配; - 如果是
utf8mb4_general_ci(大小写不敏感),'Zebra'会被当成小写 z 处理,可能意外落入范围; - 汉字范围(如
BETWEEN '张' AND '王')在多数排序规则下不可靠,字典序不等于笔画或拼音顺序。
NOT BETWEEN 的逻辑容易误读
score NOT BETWEEN 60 AND 80 返回的是 score 80,不是 “排除 60–80 后剩下的中间段”——这点和直觉相反,尤其当字段含 NULL 时更危险。
-
NULL在任何比较中都为UNKNOWN,所以score NOT BETWEEN 60 AND 80不会包含score IS NULL的行; - 若需明确包含空值,得显式写成
(score NOT BETWEEN 60 AND 80) OR score IS NULL; - 多条件组合时,
NOT BETWEEN的优先级和括号位置必须清晰,避免被AND/OR搞乱逻辑。
BETWEEN 语句后,先用 EXPLAIN 看是否走了索引,再手动验证边界值是否真被包含——别只信文档说的“包含”。











