带有睡眠功能的where子句中的破折号(-)

问题描述 投票:0回答:1

在MySQL中,您可以使用SLEEP function将结果暂停x秒。

我了解您使用这种方式的时间:

SLEEP

但是最近我看到您可以用这种形式增强查询:

SELECT SLEEP(1000);

它将等待4秒钟,然后才返回与之比较的结果

mysql> select * from docs where rev = 1-sleep(4);

为什么会这样?破折号是连接函数的形式还是类似的形式?我找不到此语法的任何解释。


我使用docker复制了此查询

mysql> select * from docs where rev = 1;

以及下面的代码来创建表(使用docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest docker exec -ti some-mysql mysql -uroot -pmy-secret-pw 中的代码)并验证行为。

sql fiddle
mysql database sql-injection sleep
1个回答
4
投票

如您所链接的手册中所读,CREATE test; USE test; CREATE TABLE IF NOT EXISTS `docs` ( `id` int(6) unsigned NOT NULL, `rev` int(3) unsigned NOT NULL, `content` varchar(200) NOT NULL, PRIMARY KEY (`id`,`rev`) ) DEFAULT CHARSET=utf8; INSERT INTO `docs` (`id`, `rev`, `content`) VALUES ('1', '1', 'The earth is flat'), ('2', '1', 'One hundred angels can dance on the head of a pin'), ('1', '2', 'The earth is flat and rests on a bull\'s horn'), ('1', '3', 'The earth is like a ball.'); select * from docs where rev = 1; select * from docs where rev = 1-sleep(4); 返回0。因此,在诸如SLEEP之类的某种计算中使用它会触发where rev = 1-sleep(4);的执行(例如:等待四秒钟)。之后,使用SLEEP恢复查询,使其等于where rev = 1-0

© www.soinside.com 2019 - 2024. All rights reserved.