【问题标题】:How does escaping of mysql execute command with "insert into" work如何使用“插入”转义mysql执行命令
【发布时间】:2021-06-08 15:37:45
【问题描述】:

命令

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')

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

【问题讨论】:

    标签: mysql ssh escaping


    【解决方案1】:

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

    1. 您的本地外壳。
    2. 您通过 ssh 连接到的主机上的远程 shell。
    3. MySQL 的 SQL 解析器。

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      用单引号括起来的字符会保留引号内每个字符的字面值。单引号之间不能出现单引号,即使前面有反斜杠。

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

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

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

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

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

      这被解释为

      insert('test');
      

      【讨论】:

        猜你喜欢
        • 2015-01-20
        • 1970-01-01
        • 2011-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多