我有这样一张桌子:
CREATE TABLE IF NOT EXISTS `session` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`token` varchar(32) NOT NULL,
`profile` varchar(1000) NOT NULL,
`created_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '????',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=41 ;
Run Code Online (Sandbox Code Playgroud)
和此表中的一些数据:
(38, '395d5feaf28df01aafe0781a7f34acbe', 'a:3:{s:2:"id";s:1:"2";s:8:"username";s:7:"wanmeng";s:12:"created_time";s:19:"2011-11-18 19:37:33";}', '2011-12-03 14:14:35'),
(39, '0e0ca06ed9ad86937f190eb9544ac935', 'a:3:{s:2:"id";s:1:"1";s:8:"username";s:6:"delphi";s:12:"created_time";s:19:"2011-11-18 13:29:40";}', '2011-12-03 14:28:36'),
(31, '3cba76b97cf123009632bdaa5a306385', 'a:3:{s:2:"id";s:1:"1";s:8:"username";s:6:"delphi";s:12:"created_time";s:19:"2011-11-18 13:29:40";}', '2011-12-02 15:50:21'),
(30, 'fa356333dd3ee8f1b18b8bf0a827e34c', 'a:3:{s:2:"id";s:1:"1";s:8:"username";s:6:"delphi";s:12:"created_time";s:19:"2011-11-18 13:29:40";}', '2011-12-01 15:32:47')
Run Code Online (Sandbox Code Playgroud)
当我执行查询时:SELECT*FROM sessionWHERE token = false,我希望没有返回结果,但是mysql返回结果:
39 0e0ca06ed9ad86937f190eb9544ac935 a:3:{s:2:"id";s:1:"1";s:8:"username";s:6:"delphi";... 2011-12-03 22:28:36
30 fa356333dd3ee8f1b18b8bf0a827e34c a:3:{s:2:"id";s:1:"1";s:8:"username";s:6:"delphi";... 2011-12-01 23:32:47
Run Code Online (Sandbox Code Playgroud)
看起来布尔值'false'可以匹配一些varchar,但是'fa356333dd3ee8f1b18b8bf0a827e34c'和'false'之间是否存在任何关系,为什么会这样?
在MYSQL中,FALSE不是布尔值,它是一个整数,更具体地说是零.事实上,MySQL没有布尔列类型(它有BOOL,BOOLEAN但它们只是别名TINYINT).因此,您的查询是以下内容的同义词:
SELECT * FROM session WHERE token = 0
Run Code Online (Sandbox Code Playgroud)
由于token是VARCHAR,MySQL需要将您的字符串转换为数字.运行此查询,您将了解规则:
SELECT
0 + "0001",
0 + "123abc",
0 + "abc123"
Run Code Online (Sandbox Code Playgroud)
结果,fa356333dd3ee8f1b18b8bf0a827e34c演员0因为它以字母开头,因此匹配.