我有一个有趣的结果,但不明白为什么。
SELECT *
FROM items im
WHERE ItemNumber
ItemNumber
是一个varchar(50)
。
此查询的结果是返回所有ItemNumber
以数字开头的项目。如果ItemNumber
以字母开头,则将其排除在外。
有没有人解释为什么查询以这种方式交互?
这是 MySQL 的聪明策略,并假设它知道你的意思(而不是做你写的)。
任何计算结果为非零的表达式都被认为是真的。那些以字母开头的项目不能(隐含地)转换为数字,因此它被认为是零,因此是“假”。我认为具有(字符)值'0'
的项目也被排除在外。
例如,以下语句将愉快地删除表中的所有行:
DELETE FROM foobar
WHERE 42;
您无法关闭此行为。即使在 ANSI 模式下,MySQL 也不会抛出语法表达式。
MYSQL 将返回 ItemNumber 以数字开头的所有行greater than equal to 0.5 and less than equal to -0.5
。它考虑所有数字greater >= +/-0.5 as true
。Andwhere
子句仅基于 true 或 false 起作用。
true >= -0.5 > false < 0.5 <= true
非常聪明,mysql将所有>= +/-0.5
数字视为 1(真)。对于四舍五入的非零值,它是true。
如果你写
SELECT * FROM items im WHERE 1; // will return all rows.
SELECT * FROM items im WHERE 0.5; // will return all rows.
SELECT * FROM items im WHERE 0.4; // will return nothing.
SELECT * FROM items im WHERE 1 and 0.2; // will return nothing.
SELECT * FROM items im WHERE 0.3 or 0.5; // will return all rows.
您的 WHERE 子句正在等待 BOOLEAN,我现在不知道 mysql 如何管理数字 varchar,但我认为 mysql 可能会假设数字起始字符串等于 true。它可以将查询解释为
SELECT *
FROM items im
WHERE ItemNumber IS TRUE
MySQL 支持这个应该被删除的布尔值。它会导致混乱,并会返回错误/意外的结果。没有其他 RDBMS 支持这一点。假设您有一个带有参数的过程,但您忘记指定它,如下所示
WHERE col
它将返回所有数据并且很难调试
也许您应该将 ItemNumber 与某些东西进行比较。或者试试
WHERE ItemNumber NOT NULL
或类似的东西
WHERE ItemNumber != ''