希望有人能帮我解答一下这个问题的一些疑惑。
我有一个具有此架构的表:
CREATE TABLE IF NOT EXISTS `entities` (
`id` int(6) unsigned NOT NULL,
`external_vendor_id` varchar(200) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
然后我在此表中插入一条记录:
INSERT INTO `entities`
(`id`, `external_vendor_id`)
VALUES
('1', '64835_122334');
当我使用以下语句选择一条记录时,即使子句中的 与通过该语句插入的记录不匹配,也会external_vendor_id
选择该WHERE
记录。external_vendor_id
INSERT
select id, external_vendor_id
from `entities`
where `external_vendor_id` = 64835;
MySQL 5.7.12 上发生这种情况。
问题
- 有谁知道这是否是预期的结果?(如果是这样为什么?)
- 或者这是这个 MySQL 版本的一个错误?
任何帮助都感激不尽。修改查询以避免出现此结果将非常有助于理解正在发生的情况。
简短的回答:您在这里混合和匹配数据类型。
char 字段中的数据,使用数字 [文字] 值进行查询。
这迫使 MySQL [错误地]尝试将您的 char 值转换为数字。
这样做时,它会停在第一个非数字字符处。
始终比较“同类”数据类型:
(当然,这将返回零行)。
另外,请阅读手册中有关类型转换的内容:
后台会发生某种形式的隐式转换,将您的输入值转换
64835
为char
导致选择记录的值。这可能是一个错误,但也可能是一个功能。对 MySQL 的工作原理有更多内部了解的人将能够提供更好的解释。
您可以做的就是在语句中添加单引号,以确保您传递的是 a
varchar
而不是int
正在转换的 an:您还可以
cast
将值传递给 achar(5)
:完整的数据库小提琴与示例
下面附有完整的数据库<>小提琴,显示了在各种情况下发生的情况(包括您的初步发现)。
小提琴
错误报告
如果您觉得这可能是一个错误,请转到MySQL | 报告错误并输入您已在问题中总结的信息。