【发布时间】:2011-10-09 12:03:33
【问题描述】:
我正在尝试在 Access 数据库中的列名 tblStudents 中查询一个名称 (Daniel O'Neal),但是 Access 报告了以下语句的语法错误:
Select * from tblStudents where name like 'Daniel O'Neal'
由于名称中的撇号。
我该如何克服这个问题?
【问题讨论】:
我正在尝试在 Access 数据库中的列名 tblStudents 中查询一个名称 (Daniel O'Neal),但是 Access 报告了以下语句的语法错误:
Select * from tblStudents where name like 'Daniel O'Neal'
由于名称中的撇号。
我该如何克服这个问题?
【问题讨论】:
你通过加倍来逃避',所以:
Select * from tblStudents where name like 'Daniel O''Neal'
请注意,如果您从用户输入中接受“Daniel O'Neal”,则引用错误是一个严重的安全问题。您应该始终清理字符串或使用参数化查询。
【讨论】:
' 字符的字符串变量,然后使用它们来构造 SQL 语句,您将面临 SQL 注入攻击; en.wikipedia.org/wiki/SQL_injection
当您在查询中包含字符串文字时,您可以将字符串括在单引号或双引号中; Access 的数据库引擎也可以接受。所以双引号可以避免包含单引号的字符串的问题。
SELECT * FROM tblStudents WHERE [name] Like "Daniel O'Neal";
如果您想在字符串周围保留单引号,可以将其中的单引号加倍,如其他答案中所述。
SELECT * FROM tblStudents WHERE [name] Like 'Daniel O''Neal';
注意 name 周围的方括号。我使用方括号来减少混淆数据库引擎的机会,因为 name 是 reserved word。
不清楚您为什么在查询中使用 Like 比较。根据您所展示的内容,这应该可行。
SELECT * FROM tblStudents WHERE [name] = "Daniel O'Neal";
【讨论】:
通过编写O''Neal(两个撇号)来转义O'Neal 中的撇号。
【讨论】:
...最好将名称声明为变量,并在字符串中是否有撇号之前询问:
例如:
DIM YourName 字符串
你的名字 = “丹尼尔·奥尼尔”
If InStr(YourName, "'") Then
SELECT * FROM tblStudents WHERE [name] Like """ Your Name """ ;
else
SELECT * FROM tblStudents WHERE [name] Like '" Your Name "' ;
endif
【讨论】:
Daniel"O'Neal,那又怎样?
更简单的方法:Select * from tblStudents where [name] = replace(YourName,"'","''")
【讨论】: