如何在MySql中转义撇号(')?


146

MySQL文档说,它应该是\'。但是,scite和mysql都可以''正常工作。我看到了,并且有效。我该怎么办?


您是在谈论正确''还是\'正确?
猛禽

\'是特定于MySQL的,''如果我没记错的话,则是ANSI SQL兼容的
apokryfos

取决于SQL的实现;-''\','\'和有时'[']''将允许从代码中分离出来。最重要的是,任何数量的unicode替换都将绕过此检查。这里的整个游戏都在滥用“基于转义”的质量,这种转义要求最终的'计数是偶数而不是奇数。如果通过将多个转义方法相互融合而最终变得奇怪,则可以克服转义并注入原始SQL。故事的寓意:永远不要使用字符串插值,总是使用准备好的语句。
Shayne

Answers:


185

您引用的MySQL文档实际上比您提到的要多。它还说,

A“ '”加引号的字符串内“ '”可以写为“ ''”。

(此外,您还链接到了MySQL 5.0版本的Table 8.1。Special Character Escape Sequences,当前版本是5.6-但当前的Table 8.1。Special Character Escape Sequences看起来非常相似。)

我认为有关该backslash_quote (string)参数Postgres注释具有参考价值:

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

这对我来说,与使用反斜杠转义单引号相比,使用双引号单引号是更好的总体和长期选择。

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


42

标准SQL使用加倍的引号;MySQL必须接受它才能合理合规。

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

+1。它在哪里说,应该通过'没有逃过dev.mysql.com/doc/refman/5.0/en/...
user4951

它说的是'may'而不是'should',但是信息在那里(在表格下面):字符串中包括引号字符的方法有几种:'用“ '” 引号的字符串中的“ ”可以写为“ ''” 。A“ "”加引号的字符串内“ "”可以写为“ ""”。在引号字符前加转义字符(“''”)。
乔纳森·莱夫勒

1
这是通过加倍来避免撇号的最佳方法。
Alex _TNT '16

10

我相信user2087510的意思是:

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

我也成功地使用了它。


1
为我工作,而没有找到最重要的答案
贾里德(Jared)

1
为什么用\\'而不是\'?
biniam 2015年

@biniam_Ethiopia第二个\逃离第一个
Juha Untinen

2
可能的安全问题。如果字符串已经包含\',则可以获取sql注入,因此您插入一个\,该字符串现在以\\'出现在字符串中,这将终止该字符串。请改用name.replace(“'”,“''”)
Garr Godfrey


5

这是一个例子:

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

只需使用双引号将单引号引起来即可。

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

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

4

我知道三种方式。第一个不是大多数编程语言中最漂亮的,第二个是大多数编程语言中的常用方式:

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

我个人的喜好是\',它被许多编程语言所使用,但''得到更多SQL方言的支持,因此使用选项1更好地实现兼容性。例如,Sqlite不适用于反斜杠转义符。
okdewit


0

我认为,如果您有任何带有撇号的数据点,则可以在撇号之前添加一个撇号

例如。“这是约翰的住所”

在此,MYSQL假定使用两个句子“这是约翰的位置”

您可以放置​​“这是约翰的住所”。我认为应该这样。



0

可能是题外话,但也许您是来这里寻找一种清理来自HTML表单的文本输入的方法的,这样当用户输入撇号字符时,当您尝试将文本写入SQL时它不会引发错误。数据库中基于表的表。有两种方法可以执行此操作,您可能还想阅读有关SQL注入的信息,但是PHP中的一个简单选择是使用htmlspecialchars()函数,该函数会将所有的撇号转换成'可能要存储的内容无论如何。


编码不是用于存储,而是用于显示。使用准备好的语句。
mickmackusa

我同意准备好的声明是安全性和可靠性的金标准。我重点介绍了一种特殊情况,您可能希望将文本数据存储为HTML,在这种情况下,我的方法除了使用绑定参数外,而不是使用绑定参数。HTML输入,HTML输出。
Grindlay
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.