可以'false'匹配mysql中的某些字符串吗? [英] Can 'false' match some string in mysql?

查看:71
本文介绍了可以'false'匹配mysql中的某些字符串吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个这样的表:

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 ;

以及此表中的一些数据:

and some data in this table:

(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')

当我执行查询时:SELECT * FROM session WHERE token = false,我希望没有结果返回,但是mysql返回结果:

When I execute the query: SELECT * FROM session WHERE token = false , I expect no result returned, but the mysql returns the results:

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

似乎布尔值"false"可以匹配某些varchar,但是"fa356333dd3ee8f1b18b8bf0a827e34c"和"false"之间没有任何关系,为什么会这样?

It seems like the boolean value 'false' can match some varchar, but is there any relation between 'fa356333dd3ee8f1b18b8bf0a827e34c' and 'false', why is it so?

推荐答案

在MYSQL中,不是布尔值,而是一个整数,更确切地说是零.实际上,MySQL没有布尔列类型(它具有BOOLBOOLEAN,但它们只是TINYINT的别名).因此,您的查询是以下内容的同义词:

In MYSQL, FALSE is not a boolean value, it's an integer, more specifically zero. In fact, MySQL does not have boolean column types (it has BOOL and BOOLEAN but they're mere aliases for TINYINT). So your query is a synonym for:

SELECT * FROM session WHERE token = 0

由于token是VARCHAR,因此MySQL需要将字符串转换为数字.运行此查询,您将对这些规则有所了解:

Since token is a VARCHAR, MySQL needs to convert your strings to number. Run this query and you'll get an idea about the rules:

SELECT
    0 + "0001",
    0 + "123abc",
    0 + "abc123"

结果,fa356333dd3ee8f1b18b8bf0a827e34c强制转换为0,因为它以字母开头,即匹配.

As a result, fa356333dd3ee8f1b18b8bf0a827e34c casts to 0 because it starts with a letter, thus the match.

这篇关于可以'false'匹配mysql中的某些字符串吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆