【问题标题】:Inconsistent int/varchar cast in WHERE closeWHERE close 中的 int/varchar 类型不一致
【发布时间】:2019-09-05 09:22:33
【问题描述】:

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

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

SELECT * FROM my_table where `id`=40000; 

我返回了 1 行,ID 为 4e4a2269774a0032fbca2b4692b560b3


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

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

返回同一行并带有“not 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

【问题讨论】:

  • SELECT id FROM my_table where id = 40000; 第一个查询怎么可能? Where id = 40000 它返回 4e4a2269774a0032fbca2b4692b560b3 ..它不“计算”...
  • “这就是我要问的问题” 如果是这样的话,这个问题还不清楚。请参阅Why should I provide a Minimal Reproducible Example for a very simple SQL query? 以改进问题。了解如何提供示例数据和预期结果以及如何在 sqlfiddle 中提供更好的(工作)用户案例
  • @RaymondNijland 确实发生了奇怪的事情。检查:db-fiddle.com/f/mwQ9hUVgDisBBBajCFKVHQ/0 我知道 MySQL 会将4e4a2269774a0032fbca2b4692b560b3 隐式类型转换为4。但是为什么它被转换为40000
  • @LP154 “为什么当我要求 id 为 40000 的行时,MySQL 会返回 4e4a2269774a0032fbca2b4692b560b3 的行” - 您没有要求值(字符串)4000 而是(整数)4000 的行。 MySQL 隐式地将id 字段类型转换为整数以进行比较。现在,您应该在输入参数周围使用单引号,以获得适当的结果。 where id = '40000'
  • 4e4 部分 in4e4a2269774a0032fbca2b4692b560b3 很可能是问题所在,因为那是科学记数法..

标签: mysql casting


【解决方案1】:

感谢@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 Documentation 解释了这一点:

[...]

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

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

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

【讨论】:

  • 下次提示...总是在查询后使用SHOW WARNINGS:...然后您会看到截断错误(有时)-> db-fiddle.com/f/mwQ9hUVgDisBBBajCFKVHQ/3 ...我有时会说,因为它接缝它不会显示 DECIMAL(5,0) 演员表的错误/警告,因为这很奇怪,因为 a2269774a0032fbca2b4692b560b3 也被忽略/截断...
猜你喜欢
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
  • 2016-11-19
相关资源
最近更新 更多