首页 > 解决方案 > WHERE close 中的 int/varchar 类型不一致

问题描述

我有一个带有id列 ( VARCHAR(32)) 的数据库表。

我不明白为什么这个查询会这样:

SELECT * FROM my_table where `id`=40000; 

我有 1 行返回 id4e4a2269774a0032fbca2b4692b560b3


我做了一些测试,我有以下行为

SELECT *, case when (cast(`id` as unsigned)=40000) then '40000' else 'not 40000' end FROM my_table where `id`=40000; 

同一行返回“不是 40000”。

SELECT * FROM my_table where `id`=CAST(40000 as char); 

没有返回行。

MySQL 版本是 8.0.15-commercial。

当 id 显然不是我问的那个时,为什么会返回这一行?演员表和比较是如何完成的?


为了重现这种奇怪的行为,感谢@MadhurBhaiya https://www.db-fiddle.com/f/mwQ9hUVgDisBBBajCFKVHQ/1

标签: mysqlcasting

解决方案


感谢@RaymondNijland,请参阅https://www.db-fiddle.com/f/mwQ9hUVgDisBBBajCFKVHQ/3


SELECT CAST('4e4a2269774a0032fbca2b4692b560b3' as DECIMAL(5,0));

返回 40000 因为4e4 = 4*10^4 = 40000, 然后字符串的其他部分被忽略。

所以这个查询:

SELECT `id` FROM my_table where `id`=40000; 

似乎相当于这个查询

SELECT `id` FROM my_table where CAST(`id` as DECIMAL(5,0))=40000; 

结果在某种程度上是合乎逻辑的。


MySQL 文档解释了这一点:

[...]

  • 如果其中一个参数是十进制值,则比较取决于另一个参数。如果另一个参数是十进制或整数值,则将参数作为十进制值进行比较,如果另一个参数是浮点值,则将其作为浮点值进行比较。

  • 在所有其他情况下,参数作为浮点(实)数进行比较。例如,字符串和数字操作数的比较就像浮点数的比较一样。

4e4[INSERT ANYTHING NON NUMERIC HERE]...MySQL 将其作为“浮点(实)数”与值4e4(=40000)进行比较。


推荐阅读