在int字段中查询字符串将返回该字段中包含0的所有行

时间:2019-06-28 20:58:56

标签: mysql sql

我正在对表的所有字段进行简单搜索,但是当我查询一个整数字段时,它将向我返回所有在那里有0的行。对我来说,很奇怪的是,id字段不会发生这种情况,如果它是一个单词(预期的行为),则不会检索任何内容。

SELECT * FROM seats WHERE number = "2" - this works
SELECT * FROM seats WHERE number = "hello" - this brings all the zeros
SELECT * FROM seats WHERE id = "hello" - this brings nothing

为什么会这样?

2 个答案:

答案 0 :(得分:1)

您正在混合数据类型。 MySQL会进行字符串到数字的静默转换,将前导数字转换为数字。因此'2'被转换为2。就像2million一样。

如果没有前导数字,则该值将转换为0

道德?不要混合数据类型。使用适当的数据类型进行比较。

答案 1 :(得分:1)

number的数据类型为int,因此:

WHERE number = "2"

等效于:

WHERE number = 2

因为MySql隐式将"2"转换为2,以便匹配number的数据类型。
因为转换成功将字符串转换为它代表的数字,所以您说它有效
但是这里:

WHERE number = "hello"

尝试从int中提取"hello"会导致0,因此,它等效于:

WHERE number = 0

您会看到,这这带来了所有的零点

现在,对于id,如果其数据类型为varchar,则在这里:

WHERE id = "hello"

不进行任何转换,因为不存在值为id的{​​{1}} 这不会带来任何结果
如果"hello"的数据类型为id,则它再次等效于:

int

我猜没有WHERE id = 0 的值为id,所以这什么也没带来
此处说明了所有这些:Type Conversion in Expression Evaluation