1

我有一个查询:

SELECT * FROM tb WHERE id=1 
AND 
sleep(CAST((SELECT 'a' REGEXP '^[n-z]') AS signed) * 15);

我试图了解它是如何工作的。

1) SELECT * FROM tb WHERE id=1 # 很简单,不需要解释

2) sleep(CAST((SELECT 'a' REGEXP '^[n-z]') AS signed) * 15);# 这对我来说是个棘手的问题。

我相信事情是:sleep for (-> CAST((SELECT 'a' REGEXP '^[nz]') AS signed) 乘以 15。

我的担忧是:

  • CAST 是一个转换函数(例如从字符串到日期),但在这里它用于将字符串转换为带符号的数字..对吗?

  • REGEXP,我相信是这样使用的:(SELECT 'a' REGEXP '^[n-z]')返回 0(零),所以乘以 15 总是 0。但(SELECT 'p' REGEXP '^[n-z]')返回 1,所以在这种情况下 DBMS 会休眠 15 秒。

所以,现在最后一个问题是:

  • 如果 tb 只有一条名为“bob”的记录,数据库会暂停 15 秒吗?
4

1 回答 1

2

如果 tb 只有一条名为“bob”的记录,数据库会暂停 15 秒吗?

不,使用查询,数据库永远不会暂停,因为CAST((SELECT 'a' REGEXP '^[n-z]') AS signed) * 15始终返回 0,完全独立于您的记录:它不使用表中的任何列,'a' 是字符串文字。

但除此之外,您分析它是正确的。您显示的查询没有任何意义。

于 2013-01-28T18:33:27.637 回答