gpt4 book ai didi

Mysql忽略varchar主键上的条件 'where'

转载 作者:行者123 更新时间:2023-11-29 01:57:18 25 4
gpt4 key购买 nike

我有 table

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

最佳答案

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

查询的重要部分是:

WHERE slug = 0

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

哪个整数?如果 slug'123',那就很容易了。该值将为 123。相反,该值为 aaa。 MySQL的转换规则是将字符串前导的“数字”转换为数字,直到没有“数字”为止。当根本没有数字时,值为 0。我将数字放在引号中,因为它包括“-”、“.”和“e”(用于指数表示法)。

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

关于Mysql忽略varchar主键上的条件 'where',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25297230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com