使用 "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')
据我所知,解释器应该无法理解这一点,因为我在执行字符串中有未转义的单引号。
您正在处理多个级别的报价解释器。
- 您当地的 shell.
- 你的远程 shell 在你 ssh 到的主机上。
- 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');
命令
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')
据我所知,解释器应该无法理解这一点,因为我在执行字符串中有未转义的单引号。
您正在处理多个级别的报价解释器。
- 您当地的 shell.
- 你的远程 shell 在你 ssh 到的主机上。
- 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');