在MySQL 5.7中,定义如下的表
CREATE TABLE `person` (
`person_id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(64) DEFAULT NULL,
PRIMARY KEY (`person_id`),
KEY `ix_name` (`name`)
) ENGINE=InnoDB CHARSET=utf8
然后我们准备了两个测试记录,
name
字段(varchar类型)的值是十二万三千四百五十六兆七千八百九十一亿二千三百四十五万六千七百八十九
一
分别是。
案例1
select * from person where name = 123456789123456789-1;
注意,我们在where子句中使用数字而不是字符串。返回了名为
123456789123456789
的记录,似乎忽略了最后的-1
!此外,我们添加了另一个名为
123456789123456788
的记录,这次上面的select返回两个记录,包括123456789123456789
和123456789123456788
;输出看起来很奇怪!
案例2
select * from person where name = 123456789123456789-123456789123456788;
我们可以得到名为
1
的记录,在这种情况下,-
充当减号运算符。为什么两种情况下
-
的行为如此不同! 最佳答案
我不能马上告诉你123456789123456789-1
是什么类型,但是对于比较操作,我们几乎可以肯定的是,对于mysql来说,我们已经通过了大多数更“正常”的data type conversion rules操作,结果是:
在所有其他情况下,将参数作为浮点(实数)数字进行比较。
因为比较(name
)的一个参数是字符串类型,而另一个参数是数字类型,所以没有其他匹配项。所以两者都转换为浮点类型,并且浮点类型没有太多的精度数字。当然要比将123456789123456789和123456789123456788表示为两个不同的数字所需的18个数字少。
关于mysql - 为什么在mysql where子句中忽略“-1”“name = 123456789123456789-1”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52090338/