mysql - 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
解决方案
感谢@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)进行比较。
推荐阅读
- python - 如何允许用户只编辑自己创建的对象?
- python - 漂亮的汤返回充满变量的 HTML
- c++ - C++ 特征矩阵说明
- loops - 构造一个for循环以在python中输出分类器预测
- python - 我的条形图没有出现在屏幕上。我该如何解决?
- python - python将图像保存在ram中而不保存到硬盘?
- python - 如何调整 SVM 的参数以获得更好的训练
- flask - Google Colab - Plotly Dash - 示例 dash 应用程序卡在 Prod 环境中
- c++ - 构建 NFIQ2 时从 'char' 到 'char*' 的无效转换
- javascript - 导入语句是否替换了javascript中的脚本标签?