如何在 MySQL 中转义单引号

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

This is Ashok's Pen.

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

如何正确地插入数据?

294154 次浏览

’是转义字符。所以字符串应该是:

这是 Ashok 的笔

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

例如,在 C # 中,您可以

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

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

简单地说:

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

所以在字符串中,用两个引号替换每个引号。

或者:

SELECT 'This is Ashok\'s Pen.'

Escape it =)

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

无论你使用什么库与 MySQL 交流,都会内置一个转义函数,例如在 PHP 中,你可以使用 Mysqli _ real _ escape _ string引用

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

This is Ashok's Pen.

成为:

This is Ashok\'s Pen.

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

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

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

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

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

如果使用 PHP,只需使用 addslash ()函数。

PHP Manual addslashes

使用以下代码:

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


mysql_real_escape_string($var);
?>

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

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

$var = mysqli_real_escape_string($conn, $_POST['varfield']);

我用 Delphi 的方法:

字符串“ 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 中插入或更新文本字段,没有任何问题。

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

There is another way to do this which may or may not be safer, depending upon your perspective. It requires MySQL 5.6 or later because of the use of a specific string function: FROM_BASE64.

假设您想插入以下信息:

“啊,”近乎无头的尼克挥了挥优雅的手,“这不是什么重要的事... ..。我并不是真的想加入..。我以为我会申请,但显然我‘不符合要求’”

这个引号有很多单引号和双引号,插入 MySQL 会很麻烦。如果你是从程序中插入的,很容易转义引号,等等。但是,如果你必须把它放到一个 SQL 脚本,你必须编辑文本(转义引号) ,这可能是错误倾向或敏感的字包装,等等。

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

ZV214NUlFaGxZV1JzWlhOeklFNXBZMnNZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YJNKMFlXNWpaazRnTGlBdUlDNG DTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdabZWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

关于 Base64编码的一些注释:

  1. Base64-encoding is a 二进制编码, so you'd better make sure that you get your character set correct when you do the encoding, because MySQL is going to decode the Base64-encoded string into bytes and then interpret those. Be sure base64 and MySQL agree on what the character encoding is (I recommend UTF-8).
  2. 我已经将字符串包装为50列,以便在 Stack Overflow 上具有可读性。您可以将它包装到任意数量的列(或者根本不包装) ,它仍然可以工作。

现在,把这个加载到 MySQL:

INSERT INSERT INTO my _ table (text) VALUES (FROM _ BASE64(’) ZV214NUlFaGxZV1JzWlhOeklFNXBZMnNZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YJNKMFlXNWpaazRnTGlBdUlDNG DTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdabZWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K '));

这样可以毫无怨言地插入,而且不需要手动转义字符串中的任何文本。

你可以用这个代码,

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

if mysqli_real_escape_string() does not work.

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

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

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

使用 addslash ()或 mysql _ real _ escape _ string ()。

This is how my data as API response looks like, which I want to store in the MYSQL database. It contains Quotes, HTML Code , etc.

例子:-

{


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;

插入时,在后面跟着 Stringify ()

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

Above is the JSON object and below is the SQL Query that insert data into MySQL.

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, "\\\"");

它将转义字符添加到 全部(所有)中出现的’和”

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

我猜它会工作,但在实际的内容,每一个单引号和双引号将被替换为字符

作为一个 Python 用户,我用一个原始的“’”替换引用:

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

对于 Python,我尝试了许多方法来转义’”,而不是 work,因为我有各种各样的输入。

Finally, I just use these code, the data in database was same like the input.

tmp = val.replace('\\', r'\\')
ret = tmp.replace('"', r'\"')