【问题标题】:How to escape apostrophe (') in MySql?如何在 MySql 中转义撇号(')?
【发布时间】:2012-03-24 16:42:13
【问题描述】:

MySQL documentation 表示应该是\'。但是, scite 和 mysql 都显示 '' 有效。我看到了,它有效。我该怎么办?

【问题讨论】:

  • 你说的是''还是\'是否正确?
  • \' 是 MySQL 特有的,而 '' 是 ANSI SQL 兼容的,如果我没记错的话
  • 取决于 SQL 的实现;- ' '\'' , ' \'' ,有时 '[ ']'' 将允许从代码中分离出来。除此之外,任何数量的 unicode ' 替换都将绕过此检查。这里的整个游戏都在滥用 '' 基于转义的质量,它要求最终的 ' 计数是偶数而不是奇数。如果通过将多个转义方法相互混合而最终变得奇怪,您可以击败转义并注入原始 SQL。故事的寓意:永远不要使用字符串插值,总是使用准备好的语句。

标签: mysql escaping


【解决方案1】:

您引用的 MySQL 文档实际上比您提到的要多一些。它还说,

用“'”引用的字符串中的“'”可以写成“''”。

(另外,您链接到 MySQL 5.0 version of Table 8.1. Special Character Escape Sequences,当前版本是 5.6 - 但当前 Table 8.1. Special Character Escape Sequences 看起来非常相似。)

我认为Postgres note on the backslash_quote (string) parameter 信息丰富:

这控制引号是否可以由字符串文字中的\' 表示。表示引号的首选 SQL 标准方法是将引号加倍 (''),但 PostgreSQL 历来也接受 \'。但是,使用\' 会带来安全风险...

这告诉我,使用双单引号字符比使用反斜杠转义单引号是更好的整体和长期选择。

现在,如果您还想在方程式中添加语言选择、​​SQL 数据库选择及其非标准特性以及查询框架选择,那么您最终可能会得到不同的选择。你没有提供太多关于你的约束的信息。

【讨论】:

    【解决方案2】:

    标准 SQL 使用双引号; MySQL 必须接受这一点才能合理地合规。

    'He said, "Don''t!"'
    

    【讨论】:

    • +1。它在哪里说它应该被 '' 而不是 dev.mysql.com/doc/refman/5.0/en/… 转义
    • 它说的是“可能”而不是“应该”,但信息就在那里(在表格下方):有几种方法可以在字符串中包含引号字符:“' ” 在用“'”引用的字符串中可以写成“''”。用“"”引用的字符串中的“"”可以写成“""”。在引号字符前加上转义字符(“``”)。
    • 这是将撇号翻倍的最佳方式。
    【解决方案3】:

    我认为 user2087510 的意思是:

    name = 'something'
    name = name.replace("'", "\\'")
    

    我也成功使用了这个。

    【讨论】:

    • 为我工作,而那些热门答案却没有
    • 为什么是 \\' 而不是 \' ?
    • @biniam_Ethiopia 第二个\逃脱了第一个
    • 可能的安全问题。如果字符串已经包含\',则可以进行sql注入,因此您插入一个\,它现在作为\\'在字符串中,它将终止字符串。改用 name.replace("'", "''")
    【解决方案4】:

    我知道三种方式。第一个不是最漂亮的,第二个是大多数编程语言中的常见方式:

    1. 使用另一个单引号:'I mustn''t sin!'
    2. 在单引号'前使用转义字符\'I mustn\'t sin!'
    3. 使用双引号代替单引号将字符串括起来:"I mustn't sin!"

    【讨论】:

    • 我个人的偏好是\',因为它被很多编程语言使用,但是''被更多的SQL方言支持,所以使用选项1更好地兼容。例如,Sqlite 不适用于反斜杠转义。
    【解决方案5】:

    只需写'' 代替' 我的意思是两次'

    【讨论】:

    • 用撇号两次代替一次
    【解决方案6】:

    这是一个例子:

    SELECT * FROM pubs WHERE name LIKE "%John's%"
    

    只需使用双引号将单引号括起来。

    如果你坚持使用单引号(并且需要转义字符):

    SELECT * FROM pubs WHERE name LIKE '%John\'s%'
    

    【讨论】:

      【解决方案7】:

      替换字符串

      value = value.replace(/'/g, "\\'");
      

      其中 value 是要存储在数据库中的字符串。

      进一步,

      这个的NPM包,你可以看看它

      https://www.npmjs.com/package/mysql-apostrophe

      【讨论】:

      • 请不要只发布一些工具或库作为答案。至少在答案本身中展示how it solves the problem
      • 这行不通。你忘了逃避事情。替换(/\'/g, "\\\'")
      【解决方案8】:

      我认为如果您有任何带有撇号的数据点,您可以在撇号之前添加一个撇号

      例如。 '这是约翰的地方'

      这里 MYSQL 假设有两个句子 'This is John' 's place'

      您可以输入“这是约翰的地方”。我认为它应该这样工作。

      【讨论】:

        【解决方案9】:

        可能跑题了,但也许你来这里是为了寻找一种方法来清理来自 HTML 表单的文本输入,这样当用户输入撇号字符时,它不会在你尝试编写文本时抛出错误到数据库中基于 SQL 的表。有几种方法可以做到这一点,您可能还想了解 SQL 注入。 下面是一个在 PHP 中使用准备好的语句和绑定参数的例子:

        $input_str = "Here's a string with some apostrophes (')";
        // sanitise it before writing to the DB (assumes PDO)
        $sql = "INSERT INTO `table` (`note`) VALUES (:note)";
        try {
            $stmt = $dbh->prepare($sql);
            $stmt->bindParam(':note', $input_str, PDO::PARAM_STR);
            $stmt->execute();
        } catch (PDOException $e) {
            return $dbh->errorInfo();
        }
        return "success";
        

        在您可能希望使用其 HTML 实体引用来存储撇号的特殊情况下,PHP 具有 htmlspecialchars() 函数,它将它们转换为 '。正如 cmets 所指出的,这不应该被用来代替适当的消毒,根据给出的例子。

        【讨论】:

        • 编码不是用来存储的,是用来显示的。使用准备好的语句。
        • 我同意准备好的报表是安全性和可靠性的黄金标准。我强调了一个特定情况,您可能希望将文本数据存储为 HTML,在这种情况下,我的方法是除了使用绑定参数之外,而不是代替。 HTML 输入,HTML 输出。
        • 我认为您的回答开始提出了一个很好的观点,然后下垂。在这种“简单选项”是致命缺陷的情况下,不要推荐它,尤其是对新手。
        【解决方案10】:

        在 PHP 中,我喜欢使用 mysqli_real_escape_string() 来转义字符串中的特殊字符,以便在 SQL 语句中使用。

        https://www.php.net/manual/en/mysqli.real-escape-string.php

        【讨论】:

        • 永远不要这样做。始终使用 prepared statements / bound parameters, 您的 SQL 绝不应包含语言中的原始参数(PHP / Java / C# / 任何东西)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-12
        • 2011-01-27
        • 2010-10-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多