【发布时间】:2023-03-19 00:40:01
【问题描述】:
我有一个非常复杂的问题,但我把它缩小到这个,首先,让我给你一些测试数据:
运行这个:
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`value` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
INSERT INTO test (value) VALUES
(1),
('1'),
('1,2'),
('3');
现在运行这个查询:
SELECT * FROM test WHERE value = 1;
我希望在这种情况下只获得前两行,其中值输入为数字 1 或“1”字符,但由于某种原因,这就是我得到的:
1, 1
2, 1
3, 1,2
我的问题是,为什么我得到第三行?
注意:这是我的mysql版本:5.6.28-0ubuntu0.14.04.1
另外,我已经通过使用 FIND_IN_SET 解决了我最初的问题,并且我知道使用这种逗号分隔的列表类型结构并不是一个好主意,也就是说,它可能应该首先使用连接表来完成.不幸的是,我在一个非常大的系统中工作,目前进行这种更改是不切实际的。
我只是对为什么会发生这种特定行为感兴趣。
【问题讨论】:
-
我们可以拒绝这个问题的前提吗?不要以逗号分隔的数字列表开头。
-
@Strawberry:不管存储逗号分隔的数字列表是否是个好主意,这都是一个好问题。行为出乎意料。
-
您是否尝试过 InnoDb 表格式相同的行为?
-
隐式类型转换似乎有些问题。请改用
value = '1'。 -
感谢 OP 将复杂问题缩小到特定问题。 +10。