MySQL不应该返回结果

时间:2014-08-28 14:05:14

标签: mysql

我对此感到非常困惑。我们有一个API密钥表,create SQL如下:

CREATE TABLE `api_keys` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `key` varchar(45) NOT NULL,
  `ip` varchar(15) NOT NULL DEFAULT '',
  `app` varchar(45) NOT NULL DEFAULT '',
  `active` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`key_id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;

我有两行,插入SQL如下:

INSERT INTO `api_keys` (`id`, `key`, `ip`, `app`, `active`)
VALUES
(1,'xxwxMKEkAHTcF9P3qQOOvfeuK0aMrd0GFLOoR3O6','10.0.0.1','Test App',1),
(2,'CeMbGnWO4aC4RuI7EJyZaNwidUI4nsEGEvgFNGzG','10.0.0.2','Test App 2',1);

当我运行以下查询时,我得到一个结果,它应该为空。我真的不明白。

SELECT *
FROM `api_keys`
WHERE `ip` = '10.0.0.1'
AND `key` = 0
AND `active` = 1;

似乎当0作为键传递时它返回一条记录,它不应该这样做。任何想法或建议都会得到感谢。 MySQL版本为5.6,可在Ubuntu 12.10上运行

2 个答案:

答案 0 :(得分:0)

您应该尝试使用null值而不是0

答案 1 :(得分:0)

我能够在我的环境中重现你的错误。当您将字段键与0引擎进行比较时,会发生什么呢?MySQL引擎"转换"你的字段,因为它只是转换为0,它真正匹配你比较的0。

如果你把0放在双引号之间你会解决它,试试吧:

SELECT 
    *
FROM `api_keys`
WHERE 
    `ip` = '10.0.0.1'
    AND `key` = '0'
    AND `active` = 1;

这里我们明确表示这是一个varchar而不是一个整数。