如何解决如何使用“插入”来转义 mysql 执行命令
命令
ssh ionos "mysql --verbose -usam -e 'insert into aladin.products (name,price) values ('\'test\'','\'test\'');'"
确实有效。但是为什么转义字符会起作用呢?或者为什么这部分:
mysql --verbose -usam -e 'insert into aladin.products (name,'\'test\'');'
翻译成
insert into aladin.products (name,price) values ('test','test')
据我所知,解释器应该无法理解这一点,因为我在执行字符串中有未转义的单引号。
解决方法
您正在处理多个级别的报价解释器。
- 您的本地 shell。
- 您通过 ssh 连接到的主机上的远程 shell。
- MySQL 的 SQL 解析器。
这些层中的每一层都轮流解析输入并剥离一级引用。每一层“看到”前一层的引号剥离字符串的结果。
最终,这变得令人困惑。人类很难预测被剥离的每个级别的字符串格式。
简化它的一种方法是将输入通过管道传输到 ssh:
echo "insert into aladin.products (name,price) values ('test','test');" |
ssh ionos "mysql --verbose -usam"
然后您消除了大部分层和嵌套引用问题。
,Bill Karwin 的答案是正确的,应该用于提高代码的可读性。不过它并没有直接回答我的问题。
这里有一个更直接的答案:
将字符括在单引号中会保留引号内每个字符的字面值。单引号之间不能出现单引号,即使前面有反斜杠也是如此。
(https://linux.die.net/man/1/bash)
所以主要问题是 \'
没有被解释为单引号。如果我尝试这个,我只添加一个 \
并关闭字符串。我的代码可以正常工作,因为如果字符之间没有空格,则允许将字符串粘合在一起。
这是我的代码的一个简单示例:
mysql 'insert ('\'test\'');'
“mysql”后面的字符串实际上是insert (
+ \'
+ test
+ \'
+ );
这被解释为
insert('test');
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。