【发布时间】: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很可能是问题所在,因为那是科学记数法..