为何MySQL中仅含列名无值匹配的WHERE子句不触发语法错误?
为啥
SELECT * FROM my_table WHERE id在MySQL里不报错还结果不一样? 你用惯SQL Server觉得诧异很正常——SQL Server要求WHERE子句必须写明确的布尔判断,直接写列名肯定触发语法错误,但MySQL允许把列值自动转换为布尔值作为查询条件,这是两种数据库的语法规则差异。
结果不一致的核心原因
MySQL处理WHERE 列名这种写法时,会按列的类型做不同的隐式转换:
- 数值类型列(比如INT类型的id):
0、NULL会被判定为假,不会返回;非0的数值都会被判定为真,所以WHERE id等价于WHERE id <> 0 AND id IS NOT NULL,这就是查询id能返回有效记录的原因。 - 字符串类型列(比如VARCHAR类型的name):
空字符串''、字符串'0'、NULL会被判定为假;只有既非空又不等于'0'的字符串才会被判定为真。如果你的name列值全是'0'、空值或者NULL,查询WHERE name自然就没有结果返回。
更稳妥的写法建议
为了避免跨数据库的语法差异和逻辑歧义,无论使用哪种数据库,都应该写明确的布尔表达式:
- 检查数值列非空且非0:
WHERE id IS NOT NULL AND id != 0 - 检查字符串列非空且非
'0':WHERE name IS NOT NULL AND name != '' AND name != '0'
内容的提问来源于stack exchange,提问作者Paulo Fernando
相关产品推荐
相关产品推荐

