Mysql忽略了contition' where'在varchar主键上

时间:2014-08-13 22:26:32

标签: mysql sql

我有桌子

DROP TABLE IF EXISTS `slug`;
CREATE TABLE `slug` (
  `slug` varchar(255) NOT NULL,
  `id` int(10) unsigned NOT NULL,
  `table` varchar(64) NOT NULL,
  PRIMARY KEY (`slug`),
  UNIQUE KEY `id_table` (`id`,`table`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `slug` (`slug`, `id`, `table`) VALUES
('aaa', 3,  'team');

我选择了

SELECT `slug`, `id`, `table` 
FROM `slug` 
WHERE (`slug` = 0)

,结果是

+------+----+-------+
| slug | id | table |
+------+----+-------+
| aaa  |  3 | team  |
+------+----+-------+

条件是 slug = 0 ,但我得到的行是slug是' aaa'。

有什么想法吗?

Mysql版本5.5.38-0ubuntu0.12.04.1

2 个答案:

答案 0 :(得分:3)

请注意,使用保留字(例如table)作为列名称是一个坏主意。然而,这与您的问题无关。

查询的重要部分是:

WHERE slug = 0

MySQL如何处理这个问题?它能做什么?毕竟,您已将slug声明为varchar(),但它正在与整数进行比较。那么,MySQL所做的是静默转换为数字类型。因此,它将slug中的值转换为整数。

哪个整数?如果slug'123',则很容易。该值为123。相反,值为aaa。 MySQL的转换规则是转换前导"数字"字符串到一个数字,直到不再是"数字"。如果根本没有数字,则值为0。我把数字放在引号中,因为它包括' - ','。'和' e' (用于指数表示法)。

因此,您的where子句会将任何不以数字0开头的字符串与0进行比较。以下值均应通过:'aaa''zzz''0abc',等等。

答案 1 :(得分:0)

这是预期的行为。 在MySQL中,零数可以等于任何字符串。 因此,当您想要将字符串与整数列的值进行比较时,必须将整数值转换为字符串。