MySQL Query - 子句`where(varchar)`返回仅以数字开头的项目。为什么?

时间:2012-07-12 13:34:28

标签: mysql sql

我有一个有趣的结果,不明白为什么。

SELECT * 
  FROM items im
 WHERE ItemNumber

ItemNumbervarchar(50)

此查询的结果是返回ItemNumber以数字开头的所有项目。如果ItemNumber以字母开头,则会将其排除。

有没有人解释为什么查询会以这种方式进行交互?

5 个答案:

答案 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 truewhere子句仅基于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 != ''
相关问题