如何在 MySQL 中避免使用撇号(’) ?

MySQL 文档说应该是 \'。然而,scite 和 mysql 都显示 ''也可以工作。我看到它生效了。我该怎么选?

334253 次浏览

标准 SQL 使用双引号; MySQL 必须接受双引号才能达到合理的兼容性。

'He said, "Don''t!"'

这里有一个例子:

SELECT * FROM pubs WHERE name LIKE "%John's%"

只要使用双引号来包括单引号。

如果你坚持使用单引号(以及需要转义字符) :

SELECT * FROM pubs WHERE name LIKE '%John\'s%'

你引用的 MySQL 文档实际上说的比你提到的多一点,它还说,

引用“ '”的字符串中的“ '”可以写成“ ''”。

(另外,您链接到了 MySQL 5.0版本的表8.1. < em > 特殊字符转义序列 ,当前版本是5.6ーー但是当前的 表8.1. < em > 特殊字符转义序列 看起来非常相似。)

我认为 关于 backslash_quote (string)参数的 Postgres 注释提供了很多信息:

这控制引号是否可以用字符串文字中的 \'表示。表示引号的首选 SQL 标准方法是将其加倍('') ,但 PostgreSQL 在历史上也接受 \'。然而,使用 \'会带来安全风险..。

这说明使用双引号的单引号字符比使用反斜杠转义单引号要好得多。

现在,如果您还想添加语言的选择、 SQL 数据库的选择及其非标准特性,以及查询框架的选择,那么您最终可能会有不同的选择。您没有提供关于约束的太多信息。

我相信 user2087510的意思是:

name = 'something'
name = name.replace("'", "\\'")

我也成功地利用了这一点。

只要写 ''代替 '我的意思是两次 '

我知道有三种方式。前者不是最漂亮的,后者是大多数编程语言中的常见方式:

  1. 使用另一个单引号: 'I mustn''t sin!'
  2. 在单引号 ': 'I mustn\'t sin!'之前使用转义字符 \
  3. 使用双引号包括字符串而不是单引号: "I mustn't sin!"

把绳子换掉

value = value.replace(/'/g, "\\'");

其中 value 是要存储在数据库中的字符串。

此外,

这个 NPM 包,您可以查看它

Https://www.npmjs.com/package/mysql-apostrophe

我认为如果你有任何数据点与撇号,你可以添加一个撇号之前的撇号

这是约翰的地方

这里 MYSQL 假设有两句话‘这是约翰的地方’

你可以写“这是约翰的地方”,我认为应该这样写。

在 PHP 中,我喜欢使用 mysqli _ real _ escape _ string () ,它转义字符串中的特殊字符,用于 SQL 语句。

https://www.php.net/manual/en/mysqli.real-escape-string.php

可能是跑题了,但也许您来这里是为了找到一种方法来清除 HTML 表单中的文本输入,这样当用户输入撇号字符时,当您试图将文本写入 DB 中基于 SQL 的表时,它就不会抛出错误。有几种方法可以做到这一点,您可能还想阅读有关 SQL 注入的内容。 下面是在 PHP 中使用预置语句和绑定参数的示例:

$input_str = "Here's a string with some apostrophes (')";
// sanitise it before writing to the DB (assumes PDO)
$sql = "INSERT INTO `table` (`note`) VALUES (:note)";
try {
$stmt = $dbh->prepare($sql);
$stmt->bindParam(':note', $input_str, PDO::PARAM_STR);
$stmt->execute();
} catch (PDOException $e) {
return $dbh->errorInfo();
}
return "success";

在特殊情况下,您可能希望使用它们的 HTML 实体引用来存储撇号,PHP 具有 Htmlspecalchars ()函数,该函数将它们转换为 &#039;。正如评论所指出的,这不应该被用来替代适当的消毒,正如给出的例子所示。