MySQL CREATE/DROP USER 返回 0

Posted

技术标签:

【中文标题】MySQL CREATE/DROP USER 返回 0【英文标题】:MySQL CREATE/DROP USER returns 0 【发布时间】:2015-08-11 05:56:24 【问题描述】:

为什么会这样

$dbh->exec(CREATE USER 'usr'@'localhost' IDENTIFIED BY 'Pass100');

即使创建了用户也返回 0?这适用于 MariaDB 10。

【问题讨论】:

"PDO::exec() 返回被您发出的 SQL 语句修改或删除的行数。如果没有行受到影响,则 PDO::exec() 返回 0。 " 所以我的假设是 CREATE USER 语句不会影响任何行,尽管可能会隐式修改 mysql 数据库。 php.net/manual/en/pdo.exec.php 我想这应该是一个答案。稍等,我会在下面发布。 【参考方案1】:

根据the PDO docs,PDO::exec() 返回修改或删除的行数,如果没有,则返回零。

PDO::exec() 返回被您发出的 SQL 语句修改或删除的行数。如果没有行受到影响,PDO::exec() 返回 0

CREATE USER/DROP USER 语句,虽然它隐式修改了 mysql.user 表,但不会像 INSERTDELETE 语句那样注册为影响任何行,因此 exec() 返回零。

例如从命令行:

MariaDB [(none)]> CREATE USER u@localhost;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> DROP USER u@localhost;
Query OK, 0 rows affected (0.00 sec)

因此,0 返回值不应被视为失败或虚假值。换句话说,请注意不要使用这样的表达式:

// Do not do this:
if (!$dbh->exec("CREATE USER 'usr'@'localhost' IDENTIFIED BY 'Pass100'")) 
  // Handle error

改为使用严格比较 === 来测试 FALSE 返回:

if ($dbh->exec("CREATE USER 'usr'@'localhost' IDENTIFIED BY 'Pass100'") === FALSE) 
  // Handle error

如果在创建用户的过程中出现任何错误,比如用户已经存在或者你没有创建它的权限,MariaDB 会报错,导致PDO::exec() 返回FALSE 而不是整数@987654336 @,或者如果你为PDO::ERRMODE_EXCEPTION配置了$dbh,则抛出异常。

【讨论】:

@MichelBerkowski - 感谢您的全面回答。

以上是关于MySQL CREATE/DROP USER 返回 0的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据库管理

mysql限制用户只能访问指定数据库

架构未在 hbmddl.auto = create.drop 上删除

Spring Boot 2.2.2 和“hibernate.hbm2ddl.auto=(create|create-drop|update|validate)”不起作用

MySQL系列:MySQL加强

从 Python 到 SQL(Aginity、Netezza)的 CREATE/DROP 调用不起作用