我知道它的愚蠢想法可以与VARCHAR字段进行比较而我不应该比较它,但我只是想要了解原因。
我正在使用以下架构的表。
Table: user
--------------------
number varchar(24)
我将MyISAM作为存储引擎。
数字字段包含混合数据,即数字(如'9999999')和字符串(如'注册')。
我正在尝试运行以下查询。
SELECT * FROM user where number=0
但它返回所有行,其中number字段包含字符串值,如'signup'或在数字字段中为空。
如果我运行以下查询..
SELECT * FROM user where number=1 or SELECT * FROM user where number=97654
它们没有返回任何行,因为该行的数字字段中没有任何一行具有1或97654值。
有人可以帮我理解mysql如何将0与varchar字段进行比较吗?
答案 0 :(得分:2)
注册和其他空值,因为 MySQL会将字符串隐式转换为整数。当字符串无效或无法转换为int时,该值为0,这就是它返回的原因。
答案 1 :(得分:2)
它返回数字不可转换为数字的所有条目,或者是字符串“0”。这是因为比较事先将varchar转换为int,这导致值为0.
It is clearly described in the manual
对于实际比较,您可以使用以下查询
SELECT * FROM user where CAST(`number` AS SIGNED) = 1