如何在MySQL中转义单引号

时间:2009-05-20 09:28:54

标签: mysql string quotes

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

This is Ashok's Pen.

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

如何正确插入数据?

17 个答案:

答案 0 :(得分:104)

简单地说:

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

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

或者:

SELECT 'This is Ashok\'s Pen.'

逃脱它=)

答案 1 :(得分:9)

请参阅我对"How to escape characters in MySQL"

的回答

您使用与MySQL交谈的任何库都将具有内置的转义功能,例如在PHP中,您可以使用mysqli_real_escape_stringPDO::quote

答案 2 :(得分:8)

'是转义字符。所以你的字符串应该是: 这是阿肖克的笔

编辑:

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

例如。在C#中你可以做到

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

然后将值传递给SP。

答案 3 :(得分: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();

答案 4 :(得分:6)

这是一个非常古老的问题,但根据您的观点,还有另一种方法可以做到或许不安全。由于使用了特定的字符串函数,它需要MySQL 5.6或更高版本:FROM_BASE64

让我们说你有这个消息,你想插入:

"啊,"几乎无头的尼克挥手优雅的手,"这个问题并不重要。 。 。 。这并不像我真的想加入。 。 。 。以为我申请了,但显然我并没有满足要求' - "

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

相反,您可以对文本进行base64编码,因此您可以使用" clean"字符串:

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

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

  1. base64-encoding是一个二进制编码,所以你最好确保在编码时让你的字符集正确,因为MySQL将解码base64编码将字符串转换为字节然后解释它们。请确保base64和MySQL就字符编码的内容达成一致(我建议使用UTF-8)。
  2. 为了便于阅读,我已将字符串包装到50列。你可以将它包装到你想要的任意数量的列中(或者根本不包装),它仍然可以工作。
  3. 现在,将其加载到MySQL中:

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

    这将插入而不会有任何投诉,并且您不必手动转义字符串中的任何文本。

答案 5 :(得分:6)

使用此代码:

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

 mysql_real_escape_string($var);?>

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

答案 6 :(得分:5)

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

This is Ashok's Pen.

变为:

This is Ashok\'s Pen.

答案 7 :(得分:3)

如果您想在数据库中保留(&#39;)撇号,请使用以下代码

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

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

答案 8 :(得分:3)

您可以使用此代码

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

如果mysqli_real_escape_string不起作用

答案 9 :(得分:2)

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

答案 10 :(得分:1)

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

PHP Manual addslashes

答案 11 :(得分:1)

for index, elem in enumerate(df['ad_requests']):
    if pd.isnull(elem):
        df.at[index,'ad_requests']=df.at[index-1,'ad_requests']-df.at[index-1,'impressions']

答案 12 :(得分:0)

这是我的数据作为 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&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;

插入时,接着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})`;

它的工作....

enter image description here

如果没有任何效果,试试这个:

var res = str.replace(/'/g, "\\'");
var res = res.replace(/"/g, "\\\"");

它将 \ 转义字符添加到 all(every) 出现的 ' 和 "

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

我猜它会起作用,但在实际内容中,每个单引号和双引号都将替换为 \ 字符

答案 13 :(得分:0)

对于程序化访问,您可以使用placeholders为您自动转义不安全的字符。

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

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

答案 14 :(得分:0)

使用addlahes(), 或mysql_real_escape_string

答案 15 :(得分:0)

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

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

答案 16 :(得分:0)

我的方式,使用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中插入或更新文本字段而没有任何问题。

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