[英]How to escape single quotes in MySQL
如何在 MySQL 中插入由单引号或双引号组成的值。 IE
This is Ashok's Pen.
单引号会产生问题。 可能还有其他转义字符。
如何正确插入数据?
简单地说:
SELECT 'This is Ashok''s Pen.';
所以在字符串内部,用其中的两个替换每个单引号。
要么:
SELECT 'This is Ashok\\'s Pen.'
逃脱它 =)
' 是转义字符。 所以你的字符串应该是:
这是阿肖克的钢笔
如果您使用的是一些前端代码,则需要在将数据发送到存储过程之前进行字符串替换。
例如,在 C# 中你可以这样做
value = value.Replace("'", "''");
然后将值传递给存储过程。
请参阅我对“如何在 MySQL 中转义字符”的回答
无论您使用什么库来与 MySQL 对话,都会有一个内置的转义函数,例如在 PHP 中,您可以使用mysqli_real_escape_string或PDO::quote
使用此代码:
<?php
$var = "This is Ashok's Pen.";
mysql_real_escape_string($var);
?>
这将解决您的问题,因为数据库无法检测字符串的特殊字符。
如果您使用准备好的语句,驱动程序将处理任何转义。 例如(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();
还有另一种方法可以做到这一点,这可能更安全,也可能不安全,这取决于您的观点。 由于使用了特定的字符串函数: FROM_BASE64
它需要 MySQL 5.6 或更高版本。
假设您有要插入的消息:
“啊,”差点没头的尼克优雅地挥了挥手,“无关紧要的事……我也不是真的想加入……我以为我会申请,但显然我不符合要求’——”
那个引用有一堆单引号和双引号,插入 MySQL 真的很痛苦。 如果您从程序中插入它,很容易转义引号等。但是,如果您必须将其放入 SQL 脚本中,则必须编辑文本(以转义引号),这可能容易出错或对自动换行等敏感。
相反,您可以对文本进行 Base64 编码,这样您就有了一个“干净”的字符串:
SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K
关于 Base64 编码的一些注意事项:
base64
和 MySQL 就字符编码是什么达成一致(我推荐 UTF-8)。现在,将其加载到 MySQL 中:
INSERT INTO my_table (text) VALUES (FROM_BASE64(' SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K '));
这将插入而没有任何抱怨,并且您不必手动转义字符串中的任何文本。
您应该使用\\
字符转义特殊字符。
This is Ashok's Pen.
变成:
This is Ashok\'s Pen.
如果您想在数据库中保留(')
撇号,请使用以下代码:
$new_value = str_replace("'","\'", $value);
$new_value
可以存储在数据库中。
在 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
$var = "This is Ashok's Pen.";
addslashes($var);
?>
如果 mysqli_real_escape_string() 不起作用。
如果您使用的是 PHP,只需使用 addlashes() 函数。
$var = mysqli_real_escape_string($conn, $_POST['varfield']);
对于编程访问,您可以使用占位符为您自动转义不安全的字符。
例如,在 Perl DBI 中,您可以使用:
my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string));
也许你可以看看 MySQL 手册中的函数QUOTE
。
我的做法是使用 Delphi:
要“转义”的字符串:
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 中插入或更新文本字段而不会出现任何问题。
在所有编程语言中都可以找到类似的功能!
使用addslahes() 或mysql_real_escape_string()。
这就是我的数据作为 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'\"')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.