我有桌子
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
答案 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中,零数可以等于任何字符串。 因此,当您想要将字符串与整数列的值进行比较时,必须将整数值转换为字符串。