我正在对表的所有字段进行简单搜索,但是当我查询一个整数字段时,它将向我返回所有在那里有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
为什么会这样?
答案 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