我有一个表名,id为的工作区的数据类型为bigint(20(unsigned我正试图按以下方式查询我的数据库:
-
从id=1的工作区选择*;
-
从id为"1.a"的工作区中选择*;
两者都是返回正确的结果。但我认为(2(语句是错误的,为什么sql仍然返回正确的值对吗?原因是什么?你能帮我理解为什么吗?非常感谢。
以下是关于db<>的测试用例不停摆弄
MySQL有复杂的强制转换规则,用于比较字符串文字(例如1.a
(和整列(id
(时会发生什么。这里发生的事情是MySQL从字符串中提取前导数字,然后在此基础上形成一个数字。结果,检查变为1 = 1
,这对于正在返回的特定记录是真的。
在大多数其他数据库上,您的第二个查询甚至不会执行,这通常对您更好。不应在同一比较中混合使用数字类型和非数字类型。
它从字符串中提取数字。
例如"1.a"=1
我希望它能有所帮助。
在比较运算符(本例中为=
(的边不匹配的情况下,数据库将尽最大努力将一方转换为另一方的类型。如果绝对没有办法做到这一点,它会抛出一个错误,但它仍然不会是语法错误(因为查询本身有一个有效的形式(,而是关于类型转换的一些错误。
特别是MySQL,在类型转换方面表现得非常快和松散。在将字符文字转换为数字类型的情况下,如果字符串以数字开头,它将把数字的起始序列转换为数字,并忽略其后的任何内容。