为什么 SELECT * FROM Table where username = 0 显示所有行?[用户名列是 varchar]

Jas*_*OOO 0 mysql sql

考虑以下方案:

CREATE TABLE IF NOT EXISTS `test` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) NOT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

--
-- Dumping data for table `test`
--

INSERT INTO `test` (`user_id`, `username`) VALUES
(1, 'Jason'),
(2, 'OOO'),
(3, 'Stack'),
(4, 'Overflow');
Run Code Online (Sandbox Code Playgroud)

这个查询:

SELECT * FROM TEST WHERE username = 0
Run Code Online (Sandbox Code Playgroud)

表明:

| USER_ID | USERNAME |
----------|----------|--
|       1 |    Jason |
|       2 |      OOO |
|       3 |    Stack |
|       4 | Overflow |
Run Code Online (Sandbox Code Playgroud)

但不是何时username = '0'或何时username = 1

这是 SQLFIDDLE 演示

Joh*_*Woo 5

由于用户名是String并且您已经将它与 a 进行了比较Number,MySQL 默默地将列名转换为数字。看这里。

当字符串被转换为数字并以字母开头时,该值将为零,这就是显示所有记录的原因。

添加一个 的用户名5就像这个演示一样,你会看到除了这个用户名以外的所有记录5 <> 0