我发现在一个表中,value "None" is equal to 0
mysql> select distinct id from sometable where id="None";
+-------+
| id |
+-------+
| 0 |
+-------+注意,id的类型是int(7)!
虽然mysql中所有的值都显示为0,但是当我使用PyMySQL查询django中的记录时,其中一些是0,而另一些是unicode "None",这怎么会发生呢?
发布于 2018-09-25 08:16:36
MySQL与类型转换松散。当隐式地将字符串转换为数字时,只要字符串是数字,它就会从字符串的开头接受字符,而忽略其他字符。
在您的示例中,"None"不是数字,所以MySQL将返回0。
来自Mysql 类型转换
对于字符串列与数字的比较,MySQL不能使用列上的索引来快速查找值。
隐式转换字符串对于性能来说是可怕的,因为您失去了可能在列上的索引上的用法。
下面是一个比较"2arse"字符串和2数字的示例,我们可以看到ID = "2arse"何时将返回ID = 2行数据,因为它将接受数字2,而忽略arse字符串隐式转换。
模式(MySQL v5.7)
CREATE TABLE sometable(
ID INT
);
INSERT INTO sometable VALUES (0);
INSERT INTO sometable VALUES (2);查询#1
select distinct id
from sometable
where ID = "2arse";
| id |
| --- |
| 2 |发布于 2018-09-25 08:00:16
使用强制转换,然后进行比较。
select distinct id from sometable where cast(id AS SIGNED)=0https://stackoverflow.com/questions/52493102
复制相似问题