【问题标题】:MySQL returns a result for a WHERE clause that shouldn't matchMySQL 返回不应该匹配的 WHERE 子句的结果
【发布时间】:2018-08-25 11:47:17
【问题描述】:

我有两张表,其中一张引用了另一张表。出于测试目的,我创建了这两个表

DROP TABLE IF EXISTS `test1`;
CREATE TABLE `test1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `test2_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `test1_test2_id_fk` (`test2_id`),
  CONSTRAINT `test1_test2_id_fk` FOREIGN KEY (`test2_id`) REFERENCES `test2` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;


LOCK TABLES `test1` WRITE;
INSERT INTO `test1` VALUES (1,1);
UNLOCK TABLES;

DROP TABLE IF EXISTS `test2`;
CREATE TABLE `test2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `value` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

LOCK TABLES `test2` WRITE;
INSERT INTO `test2` VALUES (1,'group','Baustahl');
UNLOCK TABLES;

到目前为止一切都很好,但是当我现在执行这个查询时:

SELECT * FROM test1 t1 JOIN test2 t2 ON t2.id = t1.test2_id WHERE t2.name = 'group' AND t2.value = 0;

IMO 它应该产生一个空结果,因为我的数据库中的valueBaustahl,我正在查询0。但是,Baustahl 结果会返回,如您在此处看到的那样

我似乎无法找到这种行为的原因,因为它是 def。不是我的期望。任何想法为什么会发生这种情况?

【问题讨论】:

  • 你的期望是什么?..添加预期的结果
  • ... 我做到了... 引用:“IMO 它应该产生一个空的结果,因为我的数据库中的值是 Baustahl 并且我正在查询 0”......也许阅读先发帖?

标签: mysql


【解决方案1】:

如果你的 t2.value 是 varchar 你应该使用 '0'

SELECT * 
FROM test1 t1 
JOIN test2 t2 ON t2.id = t1.test2_id WHERE t2.name = 'group' AND t2.value = '0';

数字 0 的值并没有像你想象的那样转换

【讨论】:

  • 谢谢。刚刚在这里stackoverflow.com/a/7881095/2823419 找到了这篇文章,它描述了同样的问题。显然是因为MySQL将该字段转换为integer,无效integer表示0,这就是它找到结果的原因。 IMO 不是 MySQL 的良好行为。我会尽快接受这个答案。
猜你喜欢
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
  • 2015-10-01
  • 2023-03-26
相关资源
最近更新 更多