使用 "insert into" 转义 mysql 执行命令如何工作

How does escaping of mysql execute command with "insert into" work

命令

ssh ionos "mysql --verbose -usam -e 'insert into aladin.products (name,price) values ('\'test\'','\'test\'');'"

有效。但是为什么转义字符有效呢?或者为什么这部分:

mysql --verbose -usam -e 'insert into aladin.products (name,price) values ('\'test\'','\'test\'');'

翻译成

insert into aladin.products (name,price) values ('test','test')

据我所知,解释器应该无法理解这一点,因为我在执行字符串中有未转义的单引号。

您正在处理多个级别的报价解释器。

  1. 您当地的 shell.
  2. 你的远程 shell 在你 ssh 到的主机上。
  3. MySQL 的 SQL 解析器。

这些层中的每一层都轮流解析输入并去除一级引用。每一层“看到”前一层引号剥离字符串的结果。

最终,这变得令人困惑。人类很难预测每一层被剥离的字符串格式。

简化它的一种方法是将输入通过管道传输到 ssh:

echo "insert into aladin.products (name,price) values ('test','test');" |
  ssh ionos "mysql --verbose -usam"

然后你消除了大部分层和嵌套引用问题。

Bill Karwin 的回答是正确的,应该使用它来提高代码的可读性。不过它并没有直接回答我的问题。

这里有一个更直接的答案:

Enclosing characters in single quotes preserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when preceded by a backslash.

(https://linux.die.net/man/1/bash)

所以主要问题是 \' 没有用单引号解释。如果我尝试这样做,我只会向它添加一个 \ 并关闭字符串。我的代码可以工作,因为如果字符之间没有 space,则允许​​将字符串粘合在一起。

这是我的代码的一个更简单的例子:

mysql 'insert ('\'test\'');'

“mysql”后面的字符串其实是insert (+\'+test+\'+);

这被解释为

insert('test');