我对此感到非常困惑。我们有一个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上运行
答案 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而不是一个整数。