提问人:Ashok Gupta 提问时间:5/20/2009 最后编辑:Super Kai - Kazuya ItoAshok Gupta 更新时间:10/23/2023 访问量:309011
如何对MySQL中的单引号进行转义?
How to escape single quotes in MySQL?
问:
如何在MySQL中插入由单引号或双引号组成的值。即
This is Ashok's Pen.
单引号会产生问题。可能还有其他转义字符。
如何正确插入数据?
答:
' 是转义字符。所以你的字符串应该是:
这是阿肖克的笔
如果使用某些前端代码,则需要在将数据发送到存储过程之前执行字符串替换。
例如,在 C# 中,您可以执行
value = value.Replace("'", "''");
然后将值传递给存储过程。
评论
''
简单地说:
SELECT 'This is Ashok''s Pen.';
因此,在字符串中,将每个单引号替换为其中的两个引号。
艺术
SELECT 'This is Ashok\'s Pen.'
逃脱它=)
评论
请参阅我对“如何在MySQL中转义字符”的回答
无论您使用什么库与MySQL通信,都将内置一个转义函数,例如在PHP中,您可以使用mysqli_real_escape_string或PDO::quote
评论
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.
您应该使用字符对特殊字符进行转义。\
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,只需使用 addslashes() 函数即可。
使用以下代码:
<?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.
也许你可以看看MySQL手册中的函数QUOTE
。
$var = mysqli_real_escape_string($conn, $_POST['varfield']);
我的做法是,通过使用 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 中插入或更新文本字段而不会出现任何问题。
在所有编程语言中都可以找到类似的功能!
还有另一种方法可以做到这一点,它可能更安全,也可能不安全,这取决于你的观点。它需要 MySQL 5.6 或更高版本,因为使用了特定的字符串函数:FROM_BASE64
。
假设您有要插入的以下消息:
“啊,”几乎无头的尼克优雅地挥了挥手,“一件无关紧要的事情。我并不是真的想加入......我以为我会申请,但显然我'不符合要求'——”
这句话有一堆单引号和双引号,插入MySQL会很痛苦。如果您从程序中插入它,则很容易转义引号等。但是,如果您必须将其放入 SQL 脚本中,则必须编辑文本(以转义引号),这可能容易出错或对换行等敏感。
相反,您可以对文本进行 Base64 编码,因此您有一个“干净”的字符串:
SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD
JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS
MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG
dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ
SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj
JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr
Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn
VkSE1uSUMwaUlBPT0K
关于 Base64 编码的一些说明:
- Base64 编码是一种二进制编码,因此您最好确保在进行编码时获得正确的字符集,因为 MySQL 会将 Base64 编码的字符串解码为字节,然后解释它们。确保和MySQL就字符编码达成一致(我建议UTF-8)。
base64
- 我已将字符串包装为 50 列,以便在 Stack Overflow 上可读。您可以将其包装成任意数量的列(或根本不包装),它仍然可以工作。
现在,要将其加载到 MySQL 中:
INSERT INTO my_table (text) VALUES (FROM_BASE64('
SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD
JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS
MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG
dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ
SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj
JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr
Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn
VkSE1uSUMwaUlBPT0K
'));
这将在没有任何抱怨的情况下插入,并且您不必手动转义字符串中的任何文本。
您可以使用此代码,
<?php
$var = "This is Ashok's Pen.";
addslashes($var);
?>
如果 mysqli_real_escape_string() 不起作用。
如果要在数据库中保留 (')
撇号,请使用以下代码:
$new_value = str_replace("'","\'", $value);
$new_value
可以存储在数据库中。
使用 addslahes() 或 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.
这就是我的数据作为 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 <a href="http://adidas.com/">adidas.com</a>.</p>
terms: '<p>adidas Gift Cards may be redeemed for merchandise on <a href="http://adidas.com/">adidas.com</a> 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})`;
它奏效了......
如果没有任何效果,请尝试以下操作:
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,我尝试了很多方法来逃避'“',但不起作用,因为我有各种输入。
最后,我只是使用这些代码,数据库中的数据与输入相同。
tmp = val.replace('\\', r'\\')
ret = tmp.replace('"', r'\"')
如果要在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"".";
*该文档解释了如何对单引号和双引号进行转义。
评论