116

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

This is Ashok's Pen.

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

如何正确插入数据?

4

18 回答 18

143

只需将每个单引号替换为其中两个:

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

或者用反斜杠转义它:

SELECT 'This is Ashok\'s Pen.'
于 2009-05-20T09:31:57.870 回答
12

' 是转义字符。所以你的字符串应该是:

这是阿肖克的钢笔

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

例如,在 C# 中,您可以这样做

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

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

于 2009-05-20T09:30:08.013 回答
9

使用此代码:

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

    mysql_real_escape_string($var);
?>

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

于 2014-07-12T16:19:42.037 回答
9

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

无论您使用什么库来与 MySQL 对话,都将内置转义函数,例如在 PHP 中,您可以使用mysqli_real_escape_stringPDO::quote

于 2009-05-20T09:33:16.307 回答
8

如果您使用准备好的语句,驱动程序将处理任何转义。例如(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();
于 2013-05-23T09:56:54.443 回答
6

根据您的观点,还有另一种方法可能更安全,也可能不安全。由于使用了特定的字符串函数,它需要 MySQL 5.6 或更高版本:FROM_BASE64.

假设您要插入此消息:

“啊,”差点没头的尼克优雅地摆了摆手,“无关紧要的事情……我又不是真的想加入……本来想申请的,但显然我没有达到要求’——”

该引用有一堆单引号和双引号,插入 MySQL 会很痛苦。如果从程序中插入,很容易转义引号等。但是,如果必须将其放入 SQL 脚本中,则必须编辑文本(以转义引号),这可能容易出错或对自动换行等敏感。

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

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

关于 Base64 编码的一些说明:

  1. Base64-encoding 是一种二进制编码,所以你最好确保你在编码时得到正确的字符集,因为 MySQL 会将 Base64 编码的字符串解码为字节,然后解释它们。确保base64和 MySQL 同意字符编码是什么(我推荐 UTF-8)。
  2. 为了便于在 Stack Overflow 上阅读,我已将字符串包装为 50 列。您可以将它包装到您想要的任意数量的列(或根本不包装),它仍然可以工作。

现在,将其加载到 MySQL 中:

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

这将插入没有任何抱怨,并且您不必手动转义字符串中的任何文本。

于 2017-02-16T20:18:33.380 回答
5

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

This is Ashok's Pen.

变成:

This is Ashok\'s Pen.
于 2009-05-20T09:34:06.650 回答
5

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

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

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

于 2017-04-27T19:48:01.923 回答
3

在 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);
?>
于 2013-11-06T17:56:14.150 回答
3

您可以使用此代码,

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

如果 mysqli_real_escape_string() 不起作用。

于 2017-03-10T13:27:51.207 回答
1

如果您使用的是 PHP,只需使用 addlashes() 函数。

PHP 手册添加斜杠

于 2013-11-27T12:37:15.250 回答
1
$var = mysqli_real_escape_string($conn, $_POST['varfield']);
于 2016-11-22T10:44:08.073 回答
0

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

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

my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string)); 
于 2013-05-22T23:40:37.807 回答
0

使用addlahes() 或mysql_real_escape_string()。

于 2018-04-19T11:25:27.070 回答
0

我使用Delphi的方式:

TheString 要“转义”:

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 中插入或更新文本字段。

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

于 2016-12-10T12:47:28.693 回答
0

也许您可以查看QUOTEMySQL 手册中的功能。

于 2015-12-04T08:40:08.530 回答
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})`;

它的工作......

在此处输入图像描述

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

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

它将 \ 转义字符添加到所有(每次)出现的 ' 和 "

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

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

于 2021-06-21T04:10:51.930 回答
0

作为 Python 用户,我将引号替换为原始“'”:

don_not_work_str = "This is Ashok's Pen."
work_str = don_not_work_str.replace("'", r"\'")
于 2021-12-30T02:38:23.360 回答