SQL语法语句中有什么错误



我有一个表名,id为的工作区的数据类型为bigint(20(unsigned我正试图按以下方式查询我的数据库:

  1. 从id=1的工作区选择*;

  2. 从id为"1.a"的工作区中选择*;

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

以下是关于db<>的测试用例不停摆弄

MySQL有复杂的强制转换规则,用于比较字符串文字(例如1.a(和整列(id(时会发生什么。这里发生的事情是MySQL从字符串中提取前导数字,然后在此基础上形成一个数字。结果,检查变为1 = 1,这对于正在返回的特定记录是真的。

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

它从字符串中提取数字。

例如"1.a"=1

我希望它能有所帮助。

在比较运算符(本例中为=(的边不匹配的情况下,数据库将尽最大努力将一方转换为另一方的类型。如果绝对没有办法做到这一点,它会抛出一个错误,但它仍然不会是语法错误(因为查询本身有一个有效的形式(,而是关于类型转换的一些错误。

特别是MySQL,在类型转换方面表现得非常快和松散。在将字符文字转换为数字类型的情况下,如果字符串以数字开头,它将把数字的起始序列转换为数字,并忽略其后的任何内容。

最新更新