在MySQL中插入包含单引号的值

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

This is Ashok's Pen. 

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

你如何正确插入数据?

简单地说:

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

所以在string里面,用两个单引号replace每个单引号。

要么:

SELECT 'This is Ashok\'s Pen.'

转义=)

看到我的答案“如何在MySQL中转义字符”

无论你用什么库来与MySQL交谈,都会内置一个转义函数,例如在PHP中,你可以使用mysql_real_escape_string

'是逃避angular色。 所以你的string应该是:这是Ashok的笔

编辑:

如果您正在使用某些前端代码,则需要在将数据发送到SP之前进行stringreplace。

例如。 在C#中你可以做

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

然后把价值传递给SP。

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

 This is Ashok's Pen. 

变为:

 This is Ashok\'s Pen. 

如果您使用准备好的语句,驱动程序将处理任何转义。 例如(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 $var = "This is Ashok's Pen."; mysql_real_escape_string($var);?> 

这将解决你的问题导致数据库无法检测到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); ?> 

这是一个非常古老的问题,但还有另一种方法可以做到这一点,这可能会或可能不会更安全,这取决于您的观点。 它需要MySQL 5.6或更高版本,因为使用了特定的string函数: FROM_BASE64

假设你有这个消息你想插入:

“啊,”几乎没有头的尼克挥了挥手,“没有什么重要的事情……这不是我真的想join……我以为我会申请,但显然我不符合要求' – “

这个引用有一堆单引号和双引号,这将是一个真正的痛苦插入MySQL。 如果你是从程序中插入它,很容易就可以避免引号等等。但是,如果你必须把它放到一个SQL脚本中,你将不得不编辑文本(以避免引号),这可能是错误的或对单词包装等敏感

相反,你可以base64编码文本,所以你有一个“干净的”string:

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

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

  1. base64编码是一种二进制编码 ,所以你最好在编码时确保你的字符集正确,因为MySQL将把base64编码的string解码为字节,然后解释这些字符。 确保base64和MySQL对字符编码是一致的(我推荐使用UTF-8)。
  2. 为了便于阅读,我将string包装为50列。 你可以把它包装成你想要的任意数量的列(或者根本不换行),它仍然可以工作。

现在,加载到MySQL:

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

这将插入没有任何抱怨,你不必手动转义string内的任何文本。

如果你想保留(')撇号在数据库中使用下面的代码

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

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

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

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

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

如果你使用php只是使用addslashes()函数

PHP手册addslashes

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

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

我使用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 "; 

这个函数将用“\”replace所有的Char(39),允许你在MySQL中插入或者更新文本字段,没有任何问题。

所有编程语言中都有类似的function!

你可以使用这个代码

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

如果mysqli_real_escape_string不起作用

 $var = mysqli_real_escape_string($conn, $_POST['varfield']);