4

可能重复:
在传递给 ODBC 之前转义输入数据的正确方法

我从查询 ODBC 查询中得到的错误是:

(pos: 72 '...M = 'Owen O'^Donavon' AND...') - syntax error

当我试图逃避它时:

(pos: 73 '... = 'Owen O\'^Donavon' AND...') - syntax error

^ 表示它正在中断的地方

我尝试了以下方法:

NAM = '".$var."'

还有这个:

NAM = '".mysql_escape_string($var)."'

然后我绝望了

NAM = \"".$var."\"

其中 $var 是其中包含 ' 的任何名称。

如果您需要整个查询:

UPDATE TABLE SET COLUMN1 = 'ERR' WHERE COLUMN_NAM = '".mysql_escape_string($var)."' AND COLUMN7 = 0");

有人知道我怎样才能正确地逃脱报价吗?

4

1 回答 1

4

要在 MySQL 字符串文字中包含单引号(由单引号分隔),请使用两个单引号字符。例如

'I don''t like it'

实际上,当 MySQL 解析它时,它将看到两个单引号字符,并将其解释为文字中的一个单引号,而不是看到字符串文字的“结束”。

但是(正如您所发现的)当您在那里只有一个单引号时,MySQL 解析器对其进行了调整。考虑这个例子:

'I don't like it' 

MySQL 解析器看到的是一个字符串文字,长度为五个字符,包含'I don'. 然后 MySQL 认为该文字后面跟着一些需要解析的标记:t like it. 解析器不会将其视为字符串文字的一部分。前面的单引号标记了字符串文字的结尾。

所以现在,MySQL 解析器无法对t like it应该是什么做出正面或反面。它将这些标记后面的单引号视为另一个字符串文字的开头。(因此,您可以非常聪明地了解那里出现的内容,并设法获得 MySQL 确实理解的东西......这可能会更糟。)

(注意:此问题并非特定于 ODBC;这会影响在 MySQL 查询文本中使用字符串文字的客户端。)


避免此类问题的一种方法是在查询文本中使用绑定变量,而不是字符串文字。(但是对于 MySQL,无论如何,发生的事情是转义,发送到 MySQL 服务器的内容(可以说是在幕后)是字符串文字。

有时我们确实需要在查询文本中包含字符串文字,并且我们不应该被要求使用绑定变量作为解决方法。因此,最好知道如何在用单引号括起来的字符串文字中“转义”单引号。

于 2012-12-21T23:14:50.917 回答