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