【问题标题】:How to escape single quotes in MySQL如何在 MySQL 中转义单引号
【发布时间】:2010-10-27 14:04:51
【问题描述】:

如何在 MySQL 中插入由单引号或双引号组成的值。即

This is Ashok's Pen.

单引号会产生问题。可能还有其他转义字符。

如何正确插入数据?

【问题讨论】:

标签: mysql string quotes


【解决方案1】:

只需将每个单引号替换为其中两个:

SELECT 'This is Ashok''s Pen.';

或者用反斜杠转义:

SELECT 'This is Ashok\'s Pen.'

【讨论】:

  • 您可能希望更新您的帖子以包含 mysql_real_escape_string() 或 addlashes() 作为可能的解决方案...如下面的 cmets 之一,OP 声明他们只是从文件中读取和插入。
  • mysql_* 方法不建议将来使用,因为它是deprecated
  • 这是正确的答案,尽管现在最好的选择是使用其中一个
【解决方案2】:

' 是转义字符。所以你的字符串应该是:

这是阿肖克的笔

如果你正在使用一些前端代码,你需要在将数据发送到存储过程之前进行字符串替换。

例如,在C#中你可以这样做

value = value.Replace("'", "''");

然后将值传递给存储过程。

【讨论】:

  • 我不是手动插入数据,我是从File中提取出来的,会有vaklues:Ashok的笔。如何插入它。创建了一个程序来执行此操作.. 如何使其正确。
  • FWIW 次要 nit:反斜杠 是“转义字符”; ''(两个单引号)是允许“转义”单引号字符的特殊替代方法。
【解决方案3】:

查看我对"How to escape characters in MySQL"的回复

无论你使用什么库来与 MySQL 对话,都会有一个内置的转义函数,例如在 PHP 中你可以使用 mysqli_real_escape_stringPDO::quote

【讨论】:

  • 我不是手动插入数据,我是从File中提取出来的,会有值:Ashok's pen。如何插入它。为此创建了一个程序..如何使其正确。
  • 请注意,This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used.
【解决方案4】:

如果您使用准备好的语句,驱动程序将处理任何转义。例如(Java):

Connection conn = DriverManager.getConnection(driverUrl);
conn.setAutoCommit(false);
PreparedStatement prepped = conn.prepareStatement("INSERT INTO tbl(fileinfo) VALUES(?)");
String line = null;
while ((line = br.readLine()) != null) {
    prepped.setString(1, line);
    prepped.executeQuery();
}
conn.commit();
conn.close();

【讨论】:

    【解决方案5】:

    使用此代码:

    <?php
        $var = "This is Ashok's Pen.";
    
        mysql_real_escape_string($var);
    ?>
    

    这将解决您的问题,因为数据库无法检测到字符串的特殊字符。

    【讨论】:

    • 请注意,This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used.
    【解决方案6】:

    根据您的观点,还有另一种方法可能更安全,也可能不安全。由于使用了特定的字符串函数,它需要 MySQL 5.6 或更高版本:FROM_BASE64

    假设您想要插入这条消息:

    “啊,”差点没头的尼克优雅地挥了挥手,“无关紧要的事情……我又不是真的想加入……本来想申请的,但显然我没有达到要求’——”

    该引号包含一堆单引号和双引号,插入 MySQL 会很痛苦。如果您从程序中插入,很容易转义引号等。但是,如果您必须将其放入 SQL 脚本中,则必须编辑文本(以转义引号),这可能容易出错或对自动换行等敏感。

    相反,您可以对文本进行 Base64 编码,因此您有一个“干净”的字符串:

    SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

    关于 Base64 编码的一些注意事项:

    1. Base64 编码是一种二进制编码,所以你最好确保你在编码时得到正确的字符集,因为 MySQL 会将 Base64 编码的字符串解码为字节,然后解释这些。确保base64 和 MySQL 同意字符编码是什么(我推荐 UTF-8)。
    2. 为了在 Stack Overflow 上的可读性,我已将字符串包装为 50 列。您可以将它包装到您想要的任意数量的列(或根本不包装),它仍然可以工作。

    现在,将其加载到 MySQL 中:

    INSERT INTO my_table (text) VALUES (FROM_BASE64(' SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K '));

    这将毫无怨言地插入,并且您不必手动转义字符串中的任何文本。

    【讨论】:

      【解决方案7】:

      您应该使用 \ 字符转义特殊字符。

      This is Ashok's Pen.
      

      变成:

      This is Ashok\'s Pen.
      

      【讨论】:

        【解决方案8】:

        如果您想在数据库中保留 (') 撇号,请使用以下代码:

        $new_value = str_replace("'","\'", $value); 
        

        $new_value可以存入数据库。

        【讨论】:

          【解决方案9】:

          您可以使用此代码,

          <?php
               $var = "This is Ashok's Pen.";
               addslashes($var);
          ?>
          

          如果 mysqli_real_escape_string() 不起作用。

          【讨论】:

            【解决方案10】:

            在 PHP 中,使用mysqli_real_escape_string

            PHP 手册中的示例:

            <?php
            $link = mysqli_connect("localhost", "my_user", "my_password", "world");
            
            /* check connection */
            if (mysqli_connect_errno()) {
                printf("Connect failed: %s\n", mysqli_connect_error());
                exit();
            }
            
            mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City");
            
            $city = "'s Hertogenbosch";
            
            /* this query will fail, cause we didn't escape $city */
            if (!mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) {
                printf("Error: %s\n", mysqli_sqlstate($link));
            }
            
            $city = mysqli_real_escape_string($link, $city);
            
            /* this query with escaped $city will work */
            if (mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) {
                printf("%d Row inserted.\n", mysqli_affected_rows($link));
            }
            
            mysqli_close($link);
            ?>
            

            【讨论】:

              【解决方案11】:
              $var = mysqli_real_escape_string($conn, $_POST['varfield']);
              

              【讨论】:

                【解决方案12】:

                如果您使用的是 PHP,只需使用 addlashes() 函数即可。

                PHP Manual addslashes

                【讨论】:

                  【解决方案13】:

                  对于编程访问,您可以使用placeholders 自动为您转义不安全的字符。

                  例如,在 Perl DBI 中,您可以使用:

                  my $string = "This is Ashok's pen";
                  $dbh->do("insert into my_table(my_string) values(?)",undef,($string)); 
                  

                  【讨论】:

                    【解决方案14】:

                    使用 addlahes() 或 mysql_real_escape_string()。

                    【讨论】:

                    • 请注意,This, mysql_real_escape_string() extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used.
                    • 是的,现在需要添加一个 i mysqli_real_escape_string php.net/manual/en/mysqli.real-escape-string.php
                    • 更新你的答案会更好(例如,cmets 可能随时消失)。
                    【解决方案15】:

                    我使用 Delphi 的方式:

                    要“转义”的字符串:

                    TheString=" bla bla bla 'em some more apo:S 'em and so on ";
                    

                    解决方案:

                    StringReplace(TheString, #39,'\'+#39, [rfReplaceAll, rfIgnoreCase]);
                    

                    结果:

                    TheString=" bla bla bla \'em some more apo:S \'em and so on ";
                    

                    此函数将所有 Char(39) 替换为“\'”,让您可以毫无问题地在 MySQL 中插入或更新文本字段。

                    在所有编程语言中都可以找到类似的功能!

                    【讨论】:

                      【解决方案16】:

                      也许您可以查看 MySQL 手册中的函数 QUOTE

                      【讨论】:

                        【解决方案17】:

                        这就是我的数据作为 API 响应的样子,我想将其存储在 MYSQL 数据库中。它包含引号、HTML 代码等。

                        例子:-

                        {
                        
                        rewardName: "Cabela's eGiftCard $25.00",
                        
                        shortDescription: '<p>adidas gift cards can be redeemed in over 150 adidas Sport Performance, adidas Originals, or adidas Outlet stores in the US, as well as online at&nbsp;<a href="http://adidas.com/">adidas.com</a>.</p>
                        
                        terms: '<p>adidas Gift Cards may be redeemed for merchandise on&nbsp;<a href="http://adidas.com/">adidas.com</a>&nbsp;and in adidas Sport Performance, adidas Originals, and adidas Outlet stores in the United States.'
                        
                        }
                        

                        解决方案

                        CREATE TABLE `brand` (
                        `reward_name` varchar(2048),
                        `short_description` varchar(2048),
                        `terms` varchar(2048),  
                        ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;
                        

                        插入时,在后面跟着JSON.stringify()

                            let brandDetails= {
                            rewardName: JSON.stringify(obj.rewardName),  
                            shortDescription: JSON.stringify(obj.shortDescription),
                            term: JSON.stringify(obj.term),
                             }
                        

                        上面是 JSON 对象,下面是向 MySQL 插入数据的 SQL Query。

                        let query = `INSERT INTO brand (reward_name, short_description, terms) 
                        VALUES (${brandDetails.rewardName}, 
                        (${brandDetails.shortDescription}, ${brandDetails.terms})`;
                        

                        成功了……

                        如果没有任何效果,试试这个:

                        var res = str.replace(/'/g, "\\'");
                        var res = res.replace(/"/g, "\\\"");
                        

                        它将 \ 转义字符添加到 all(every) 出现的 ' 和 "

                        不确定它是否是解决问题的正确/专业方法

                        我猜它会起作用,但在实际内容中,每个单引号和双引号都将替换为 \ 字符

                        【讨论】:

                          【解决方案18】:

                          作为 Python 用户,我将引号替换为原始“'”:

                          don_not_work_str = "This is Ashok's Pen."
                          work_str = don_not_work_str.replace("'", r"\'")
                          

                          【讨论】:

                            猜你喜欢
                            • 2011-06-13
                            • 1970-01-01
                            • 1970-01-01
                            • 2012-07-25
                            • 2023-04-02
                            • 2012-04-11
                            相关资源
                            最近更新 更多