MySQL CLI 中的 DROP USER IF EXISTS 语法错误

MySQL CLI 中的 DROP USER IF EXISTS 语法错误

我使用带有 Bash 的 Ubuntu 16.04 和 MySQL Ver 14.14 Distrib 5.7.21,对于 Linux (x86_64),使用 EditLine 包装器。

我尝试直接从命令行为 webapp(WordPress)创建一个 DB 堆栈,并在此分享我所知道的最佳方法和我遇到的问题(答案可能会提供更好的方法)。

我尝试执行以下 MySQL CLI 代码,在其中创建一个授权的全特权用户 + 一个同名的数据库实例:

cat <<-EOF | mysql -u root -p"$dbrootp_1"
    DROP USER IF EXISTS "$domain"@"localhost";
    DROP DATABASE IF EXISTS "$domain";
    CREATE USER "$domain"@"localhost" IDENTIFIED BY "$dbuserp_1";
    CREATE DATABASE "$domain";
    GRANT ALL PRIVILEGES ON "$domain".* TO "$domain"@"localhost";
EOF

执行输出以下错误:

ERROR 1064 (42000) at line 2:您的 SQL 语法有错误;

检查与您的 MySQL 服务器版本对应的手册,了解在第 1 行“example.com”附近使用的正确语法

我对这个错误感到困惑:问题是在第 1 行还是第 2 行?这里的语法错误是什么?我必须使用变量扩展。

根据答案更新

用户l0b0,我尝试使用您所展示的${x}替代方法"$x",但遗憾的是它输出了错误:

ERROR 1064 (42000) at line 1:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在第 1 行“-law.co.il@localhost”附近使用的正确语法。

不将数据通过管道传输到 mysql 的 cat 输出:

DROP USER IF EXISTS example.com@localhost;
DROP DATABASE IF EXISTS example.com;
CREATE USER example.com@localhost IDENTIFIED BY MYPASSWORD;
CREATE DATABASE example.com;
GRANT ALL PRIVILEGES ON example.com.* TO example.com@localhost;

答案1

正如@jordanm 指出的那样,这里的文件引号是字面意思,而不是语法。所以你要

mysql -u root -p"$dbrootp_1" <<-EOF
    DROP USER IF EXISTS ${domain}@localhost;
    DROP DATABASE IF EXISTS ${domain};
    CREATE USER ${domain}@localhost IDENTIFIED BY ${dbuserp_1};
    CREATE DATABASE ${domain};
    GRANT ALL PRIVILEGES ON ${domain}.* TO ${domain}@localhost;
EOF

如果您的$domain或中包含特殊字符,则$dbuserp_1需要在中引用它们反引号:

mysql -u root -p"$dbrootp_1" <<-EOF
    DROP USER IF EXISTS \`${domain}\`@localhost;
    DROP DATABASE IF EXISTS \`${domain}\`;
    CREATE USER \`${domain}\`@localhost IDENTIFIED BY \`${dbuserp_1}\`;
    CREATE DATABASE `${domain}`;
    GRANT ALL PRIVILEGES ON \`${domain}\`.* TO \`${domain}\`@localhost;
EOF

相关内容