string - 如何在MySQL中转义单引号

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

This is Ashok's Pen.

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

如何正确插入数据?

Ashok Gupta asked 2019-09-09T22:05:54Z
16个解决方案
103 votes

简单地说:

SELECT 'This is Ashok\'s Pen.'

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

要么:

SELECT 'This is Ashok\'s Pen.'

逃避=)

Rob answered 2019-09-09T22:06:29Z
9 votes

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

无论您使用哪种库与MySQL交谈,都将具有内置的转义功能,例如: 在PHP中你可以使用mysqli_real_escape_string或PDO :: quote

Paul Dixon answered 2019-09-09T22:07:00Z
8 votes

'是逃脱角色。 所以你的字符串应该是:这是阿肖克的笔

编辑:

如果您使用的是某些前端代码,则需要在将数据发送到SP之前进行字符串替换。

例如。 在C#你可以做到

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

然后将值传递给SP。

Rashmi Pandit answered 2019-09-09T22:07:44Z
7 votes

如果您使用预准备语句,驱动程序将处理任何转义。 例如(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();
hd1 answered 2019-09-09T22:08:08Z
6 votes

这是一个非常古老的问题,但根据您的观点,还有另一种方法可以做到这一点,这可能会也可能不会更安全。 由于使用了特定的字符串函数,它需要MySQL 5.6或更高版本:INSERT INTO my_table (text) VALUES (FROM_BASE64(' SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K '));

假设您要插入此消息:

“啊,”几乎无头的尼克挥了挥手,“这不重要......不是我真的想加入......我想我会申请,但显然我不满足要求 ' - “

这句话有一堆单引号和双引号,插入MySQL真的很痛苦。 如果你从一个程序插入它,很容易逃脱引号等。但是,如果你必须将它放入一个SQL脚本,你将不得不编辑可能容易出错的文本(以逃避引号) 或对包装等敏感

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

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

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

  1. base64-encoding是一种二进制编码,所以你最好确保在编码时让你的字符集正确,因为MySQL会将base64编码的字符串解码成字节然后解释它们。 请确保INSERT INTO my_table (text) VALUES (FROM_BASE64(' SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K ')); 和MySQL就字符编码是什么达成一致(我建议使用UTF-8)。
  2. 为了便于阅读,我将字符串包装到了50列。 您可以将它包装到您想要的任意数量的列(或根本不包装),它仍然可以工作。

现在,将其加载到MySQL:

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

这将插入没有任何投诉,您不必手动转义字符串内的任何文本。

Christopher Schultz answered 2019-09-09T22:09:39Z
5 votes

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

This is Ashok's Pen.

变为:

This is Ashok\'s Pen.
simon622 answered 2019-09-09T22:10:10Z
5 votes

使用此代码:

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

 mysql_real_escape_string($var);?>

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

user3818708 answered 2019-09-09T22:10:40Z
3 votes

您可以使用此代码

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

如果mysqli_real_escape_string不起作用

Devil answered 2019-09-09T22:11:11Z
3 votes

如果你想在数据库中保留(')撇号,请使用下面的代码

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

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

Dheeraj singh answered 2019-09-09T22:11:41Z
2 votes

在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);
?>
Marcel Verwey answered 2019-09-09T22:12:11Z
1 votes

如果您使用的是php,请使用addslashes()函数

PHP手册addslashes

Sonu answered 2019-09-09T22:12:41Z
1 votes
$var = mysqli_real_escape_string($conn, $_POST['varfield']);
Michael Temitayo Adeyanju answered 2019-09-09T22:12:59Z
0 votes

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

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

my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string)); 
Elle Fie answered 2019-09-09T22:13:30Z
0 votes

也许你可以看看Mysql手册中的函数Quote。

[http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_quote]

Julian answered 2019-09-09T22:14:00Z
0 votes

我这样做,使用Delphi:

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

所有编程语言都有类似的功能!

user7276516 answered 2019-09-09T22:14:46Z
0 votes

使用addlahes(),或mysql_real_escape_string

Anthony answered 2019-09-09T22:15:10Z
translate from https://stackoverflow.com:/questions/887036/how-to-escape-single-quotes-in-mysql