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

This is Ashok's Pen.

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

如何正确插入数据?

有帮助吗?

解决方案

把很简单:

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

所以串内,其中两个替换每个单引号。

或者:

SELECT 'This is Ashok\'s Pen.'

转义=)

其他提示

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

无论图书馆使用的是与MySQL通信将建成以避开功能,例如在PHP中,你可以使用 mysqli_real_escape_string 或的 PDO ::报价

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

  

这是阿肖克'的笔

如果您是使用一些前端代码,你需要做的字符串的数据发送给存储过程之前更换。

例如,在C#可以做

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

和再通值与存储的过程。

如果你使用准备好的语句,驱动程序将处理任何转义。例如(爪哇):

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
    $var = "This is Ashok's Pen.";

    mysql_real_escape_string($var);
?>

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

还有另一种方法可以做到这一点,它可能更安全,也可能不更安全,具体取决于您的观点。由于使用特定的字符串函数,需要 MySQL 5.6 或更高版本: FROM_BASE64.

假设您想插入以下消息:

“啊,”差点没头的尼克优雅地挥了挥手,“不重要的事。。。。我并不是真的想加入。。。。我以为我会申请,但显然我‘不符合要求’——”

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

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

JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS
MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG
dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ
SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj
JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr
Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn
VkSE1uSUMwaUlBPT0K

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

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

现在,将其加载到 MySQL 中:

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
     $var = "This is Ashok's Pen.";
     addslashes($var);
?>

如果mysqli_real_escape_string()不工作。

在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);
?>
$var = mysqli_real_escape_string($conn, $_POST['varfield']);

如果您使用PHP,只是使用和addslashes()函数。

PHP手册和addslashes

使用任一addslahes()或mysql_real_escape_string()。

的方式我这样做,通过采用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 ";

此功能将与“\'”,让您在MySQL中没有任何问题的插入或更新文本字段替换所有CHAR(39)。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top