在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编码的一些注意事项:
- base64编码是一种二进制编码 ,所以你最好在编码时确保你的字符集正确,因为MySQL将把base64编码的string解码为字节,然后解释这些字符。 确保
base64
和MySQL对字符编码是一致的(我推荐使用UTF-8)。 - 为了便于阅读,我将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']);