题
如何在 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 编码的一些注意事项:
- Base64 编码是 二进制编码, ,所以在编码时最好确保你的字符集正确,因为MySQL会将Base64编码的字符串解码为字节,然后解释它们。确定
base64
和 MySQL 在字符编码上达成一致(我推荐 UTF-8)。 - 我已将字符串包装为 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()函数。
有关的编程访问,则可以使用占位符一>自动逃避不安全的字符为您服务。
在Perl的DBI,例如,可以使用:
my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string));
使用任一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)。
类似的功能在所有的编程语言中找到了!
也许你可以看看功能 QUOTE
在MySQL手册。