我们为什么要在MySql查询中转义双引号和NULL?

时间:2013-02-01 01:58:33

标签: php mysql sql

  

可能重复:
  Today, mysql_real_escape_string() is escaping single quotes AND double quotes

我理解单引号和反斜杠具有特殊含义,因此如果我们希望将它们解释为字面含义,则需要对它们进行转义。

据我所知,mysql查询中不允许使用双引号来表示字符串(如果这个假设是正确的,这是逃避它们的唯一原因吗?)我们应该使用单引号代表字符串。

那么NULL呢?寻找具体的例子来理解为什么需要转义双引号和NULL。

添加,我已经在stackoverflow上搜索了这里,我看到大多数例子都引用了我已经理解的单引号...但是我需要理解双引号背后的原因而我找不到任何示例该...

2 个答案:

答案 0 :(得分:1)

在默认模式下,MySQL允许将字符串文字括在单引号或双引号中。

SELECT 'single', "double"

为了与其他DBMS兼容,并且只是在MySQL模式设置为ANSI_QUOTES的情况下,大多数SQL作者使用单引号来指定字符串文字。使用双引号确实没有优势。 (以及为什么以某种方式编写查询,当某人在MySQL服务器会话中更改变量时,该查询会导致查询被“破坏”。)

因此,简短的回答是双引号在所有情况下都不会需要转义,例如

SELECT 'Bob cried "Wheeeee!"'

在某些情况下,他们需要进行转义:

SELECT "Sue screamed \"Stop!\""

但在任何情况下逃避双引号都没有坏处:

SELECT 'Bob cried \"Wheeeee!\"', "Sue screamed \"Stop!\""

答案 1 :(得分:1)

来自手册; The mysql client truncates quoted strings containing NUL characters if they are not escaped

  

如果要将二进制数据插入字符串列(例如BLOB列),则应通过转义序列表示某些字符。必须转义反斜杠(“\”)和用于引用字符串的引号字符。在某些客户端环境中,可能还需要转义NUL或Control + Z.如果没有转义,mysql客户端会截断包含NUL字符的带引号的字符串,如果没有转义,则可以在Windows上使用Control + Z作为END-OF-FILE。有关表示每个字符的转义序列,请参见表9.1“特殊字符转义序列”。

参考:http://dev.mysql.com/doc/refman/5.0/en/string-literals.html#character-escape-sequences

而且你不需要逃避双引号,但我认为这在玩字符串时不是一种正确的方法。

# intead of this
INSERT INTO table (1, "John's cats")
# preferred by many programmer
INSERT INTO table (1, 'John\'s cats')
# but needs to escape here 
"INSERT INTO table (1, \"John's cats\")"