如何在MySQL中转义单引号


Answers:


126

简单地说:

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

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

要么:

SELECT 'This is Ashok\'s Pen.'

转义=)


9
您可能希望更新您的帖子,以包括mysql_real_escape_string()或addlashes()作为可能的解决方案...如下面的评论之一,OP指出它们只是从文件中读取并插入。
詹姆斯·B

3
不建议以供将来使用mysql_ *方法,因为它是不推荐使用
hd1 1

这是正确的答案,尽管如今最好的选择是使用
Ryan

10

'是转义字符。因此,您的字符串应为:

这是Ashok的笔

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

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

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

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


我不是手动插入数据,而是从“文件”中提取数据,并且会出现vaklues:Ashok的笔。如何插入。制定了执行此操作的过程..如何使其正确。
Ashok Gupta,2009年

FWIW小调:反斜杠是“转义符”;''(两个单引号)是允许“转义”单引号字符的一种特殊选择。
ToolmakerSteve

9

查看我对“如何在MySQL中转义字符”的回答

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


1
我不是手动插入数据,而是从“文件”中提取数据,并且会有值:Ashok的笔。如何插入。为此创建了一个程序..如何使其正确。
Ashok Gupta,2009年

请注意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.
NewBee '18年

7

如果使用准备好的语句,驱动程序将处理所有转义。例如(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();

7

使用此代码:

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

    mysql_real_escape_string($var);
?>

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


1
请注意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.
NewBee

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. 我将字符串包装为50列,以提高Stack Overflow的可读性。您可以将其包装到所需的任意数量的列中(或根本不包装),并且仍然可以使用。

现在,将其加载到MySQL:

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

这将插入而不会产生任何抱怨,并且您不必手动转义字符串中的任何文本。


5

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

This is Ashok's Pen.

成为:

This is Ashok\'s Pen.

3

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

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

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


3

您可以使用此代码,

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

如果mysqli_real_escape_string()不起作用。


3

在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);
?>



0

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

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

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


0

我做的方式,通过使用Delphi:

TheString“转义”:

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中插入或更新文本字段。

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.