为什么我不能使用 PDO/MySQL 将变量绑定到 'SHOW VARIABLE LIKE' 查询?

Why can't I bind a variable to a 'SHOW VARIABLE LIKE' query with PDO/MySQL?

我一直在研究 PHP PDO 文档,但我无法弄清楚此查询失败的原因。

查询如下:

$var = 'information_schema_stats_expiry';
$stmt = $pdo->prepare('SHOW VARIABLES LIKE :var');
$stmt->execute([':var' => $var]);

执行时出现此错误:

PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1

我知道我可以通过稍微改变查询来解决这个问题。这些是我测试过的一些 有效 .

$var = 'information_schema_stats_expiry';
$stmt = $this->pdo->prepare('SHOW VARIABLES LIKE "' . $var . '"');
$stmt->execute();

或者,

$var = 'information_schema_stats_expiry';
$stmt = $this->pdo->prepare('SHOW VARIABLES WHERE variable_name=:var');
$stmt->execute([':var' => $var]);

或者,同上,但有

SHOW VARIABLES WHERE variable_name LIKE :var

但是,我想了解为什么 第一个查询不起作用。它让我想起了人们试图为 LIMIT 子句绑定变量的问题,但它失败了,因为数字被引用了;但是,在这种情况下,变量名 需要 被引用,所以我认为查询可以正常工作。这是一个错误,还是有记录说明此查询失败的原因?

总而言之,当我直接通过 MySQL 客户端 运行 或在 PHP:

中作为静态查询时,此查询工作正常
SHOW VARIABLES LIKE "information_schema_stats_expiry"

但是,如果我尝试使用完全相同的语法创建准备好的语句,它将失败:

SHOW VARIABLES LIKE :var

这不起作用有什么明显的原因吗?

这是 运行宁 PHP 8 和 MySQL 8.

这是一个 MySQL 限制。并非所有陈述都可以准备。 (有一个设置参数绑定的 PREPARE 语法,我们通常不会在 PHP/PDO 中看到它。你应该得到各种各样的警告。)

SHOW VARIABLES绝对免税:
https://dev.mysql.com/doc/refman/8.0/en/sql-prepared-statements.html#prepared-statements-permitted