首页 > 解决方案 > SQL语法语句有什么问题

问题描述

我有一个表名工作区,其 id 具有数据类型 = bigint(20) unsigned 我正在尝试查询我的数据库,如下所示:

  1. SELECT * FROM 工作区,其中 id = 1;

  2. SELECT * FROM 工作区,其中 id = '1.a';

它们都返回正确的结果。但是我认为(2)语句是错误的,为什么sql仍然返回正确的值对吗?是什么原因?你能帮我理解为什么吗?太感谢了。

这是db<>fiddle 上的测试用例

标签: mysqlselectconditional-statementsbigint

解决方案


当您尝试将字符串文字(例如1.a)与整数列(id)进行比较时,MySQL 有复杂的转换规则。这里发生的是 MySQL 从字符串中获取前导数字,然后基于该数字形成一个数字。结果,检查变为1 = 1,这对于正在返回的特定记录是正确的。

在大多数其他数据库上,您的第二个查询甚至不会执行,这通常对您来说更好。您不应在同一比较中混合使用数字和非数字类型。


推荐阅读