2

在 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类型)的值是

  • 123456789123456789
  • 1

分别。

情况1

select * from person where name = 123456789123456789-1;

请注意,我们在 where 子句中使用数字而不是字符串。带名字的记录123456789123456789返回了,好像-1最后被忽略了!

此外,我们添加了另一条记录 name = 123456789123456788,这次上面的选择返回两条记录,包括123456789123456789123456789123456788;

输出看起来很奇怪!

案例2

select * from person where name = 123456789123456789-123456789123456788;

我们可以使用 name 获取记录1,在这种情况下,它似乎-充当减号运算符。

为什么-在两种情况下的行为如此不同!

4

2 回答 2

2

我不能立即告诉你类型123456789123456789-1是什么,但对于比较操作,我们几乎可以肯定会通过 mysql 的大多数更“正常”的数据类型转换规则并最终达到:

在所有其他情况下,参数作为浮点(实)数进行比较。

因为比较 ( name) 的参数之一是字符串类型,另一个是数字,所以没有其他匹配项。所以两者都被转换为浮点数并且浮点类型没有太多的精度位数。当然少于将 123456789123456789 和 123456789123456788 表示为两个不同数字所需的 18。

于 2018-08-30T06:49:25.507 回答
0

看这里:

SELECT person_id, name, name + 0.0, 123456789123456789-1 + 0.0,  name = 123456789123456789-1
FROM person
ORDER BY person_id;

也许,在比较name = 123456789123456789-1MySQL 转换之前,name正如我在 select 中展示的那样。所以一些数字丢失了。123456789123456789-1DOUBLE

演示

于 2018-08-30T06:48:07.540 回答