如何对MySQL中的单引号进行转义?

How to escape single quotes in MySQL?

提问人:Ashok Gupta 提问时间:5/20/2009 最后编辑:Super Kai - Kazuya ItoAshok Gupta 更新时间:10/23/2023 访问量:309011

问:

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

This is Ashok's Pen.

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

如何正确插入数据?

MySQL 数据库 字符串 转义 引号

评论

0赞 Peter Mortensen 7/15/2019
这可能会被骗到如何防止PHP中的SQL注入?...

答:

12赞 Rashmi Pandit 5/20/2009 #1

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

这是阿肖克的笔

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

例如,在 C# 中,您可以执行

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

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

评论

0赞 Ashok Gupta 5/20/2009
我不是手动插入数据,而是从文件中提取数据,然后会有 vaklues:Ashok 的笔。如何插入它。创建一个执行此操作的过程。.如何使其正确。
2赞 ToolmakerSteve 7/8/2020
FWIW minor nit:反斜杠是“转义字符”; (两个单引号)是允许“转义”单引号字符的特殊替代方法。''
155赞 Rob 5/20/2009 #2

简单地说:

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

因此,在字符串中,将每个单引号替换为其中的两个引号。

艺术

SELECT 'This is Ashok\'s Pen.'

逃脱它=)

评论

9赞 James B 5/20/2009
您可能希望更新您的帖子以包括 mysql_real_escape_string() 或 addslashes() 作为可能的解决方案......正如在下面的评论之一中一样,OP 指出他们只是从文件中读取并插入。
3赞 hd1 5/23/2013
不建议将来使用 mysql_* 方法,因为它已弃用
0赞 Ryan 2/24/2014
这是正确的答案,尽管现在最好的选择是使用其中之一
9赞 Paul Dixon 5/20/2009 #3

请参阅我对“如何在MySQL中转义字符”的回答

无论您使用什么库与MySQL通信,都将内置一个转义函数,例如在PHP中,您可以使用mysqli_real_escape_stringPDO::quote

评论

1赞 Ashok Gupta 5/20/2009
我不是手动插入数据,而是从文件中提取数据,并且会有值:Ashok 的笔。如何插入它。为此创建了一个过程。.如何使其正确。
0赞 NewBee 5/4/2018
只是一个注释,.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.
5赞 simon622 5/20/2009 #4

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

This is Ashok's Pen.

成为:

This is Ashok\'s Pen.
0赞 Elle Fie 5/23/2013 #5

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

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

my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string)); 
8赞 hd1 5/23/2013 #6

如果使用预准备语句,驱动程序将处理任何转义。例如(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();
3赞 Marcel Verwey 11/7/2013 #7

在 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);
?>
1赞 Sonu 11/27/2013 #8

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

PHP手册加斜杠

9赞 user3818708 7/13/2014 #9

使用以下代码:

<?php
    $var = "This is Ashok's Pen.";

    mysql_real_escape_string($var);
?>

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

评论

1赞 NewBee 5/4/2018
只是一个注释,.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.
0赞 Julian 12/4/2015 #10

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

1赞 Michael Temitayo Adeyanju 11/22/2016 #11
$var = mysqli_real_escape_string($conn, $_POST['varfield']);
0赞 user7276516 12/10/2016 #12

我的做法是,通过使用 Delphi:

TheString 到 “escape”:

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 中插入或更新文本字段而不会出现任何问题。

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

6赞 Christopher Schultz 2/17/2017 #13

还有另一种方法可以做到这一点,它可能更安全,也可能不安全,这取决于你的观点。它需要 MySQL 5.6 或更高版本,因为使用了特定的字符串函数:FROM_BASE64

假设您有要插入的以下消息:

“啊,”几乎无头的尼克优雅地挥了挥手,“一件无关紧要的事情。我并不是真的想加入......我以为我会申请,但显然我'不符合要求'——”

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

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

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

关于 Base64 编码的一些说明:

  1. Base64 编码是一种二进制编码,因此您最好确保在进行编码时获得正确的字符集,因为 MySQL 会将 Base64 编码的字符串解码为字节,然后解释它们。确保和MySQL就字符编码达成一致(我建议UTF-8)。base64
  2. 我已将字符串包装为 50 列,以便在 Stack Overflow 上可读。您可以将其包装成任意数量的列(或根本不包装),它仍然可以工作。

现在,要将其加载到 MySQL 中:

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

这将在没有任何抱怨的情况下插入,并且您不必手动转义字符串中的任何文本。

3赞 Devil 3/10/2017 #14

您可以使用此代码,

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

如果 mysqli_real_escape_string() 不起作用。

5赞 Dheeraj singh 4/28/2017 #15

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

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

$new_value可以存储在数据库中。

0赞 Anthony 4/19/2018 #16

使用 addslahes() 或 mysql_real_escape_string()。

评论

0赞 NewBee 5/4/2018
只是一个注释,.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.
0赞 Anthony 8/27/2018
是的,需要添加一个 i now mysqli_real_escape_string php.net/manual/en/mysqli.real-escape-string.php
0赞 Peter Mortensen 7/16/2019
最好更新您的答案(例如,评论可能随时消失)。
0赞 Ajay 6/21/2021 #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 查询。

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

它奏效了......

enter image description here

如果没有任何效果,请尝试以下操作:

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

它将 \ 转义字符添加到所有(每次)出现的 ' 和 ”

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

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

0赞 Lerner Zhang 12/30/2021 #18

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

don_not_work_str = "This is Ashok's Pen."
work_str = don_not_work_str.replace("'", r"\'")
0赞 我要改名叫嘟嘟 7/27/2022 #19

对于Python,我尝试了很多方法来逃避'“',但不起作用,因为我有各种输入。

最后,我只是使用这些代码,数据库中的数据与输入相同。

tmp = val.replace('\\', r'\\')
ret = tmp.replace('"', r'\"')
0赞 Super Kai - Kazuya Ito 10/20/2023 #20

如果要在MySQL中输出带有以下单引号和双引号的结果:

I'm saying "OK".

然后,您可以按如下图所示编写它:

SELECT 'I\'m saying "OK".';
SELECT 'I''m saying "OK".';
SELECT "I'm saying \"OK\".";
SELECT "I'm saying ""OK"".";

*该文档解释了如何对单引号和双引号进行转义。