我有一个名字在其中的数据库,如John Doe等.不幸的是,其中一些名字包含像Keiran O'Keefe这样的引号.现在,当我尝试搜索如下名称时:
SELECT * FROM PEOPLE WHERE SURNAME='O'Keefe'
我(可以理解)得到一个错误.
如何防止发生此错误.我正在使用Oracle和PLSQL.
转义字符是',因此您需要用两个引号替换引号.
例如,
SELECT * FROM PEOPLE WHERE SURNAME='O'Keefe'
变
SELECT * FROM PEOPLE WHERE SURNAME='O''Keefe'
也就是说,自己这样做可能是不正确的.您的语言可能具有转义字符串以在SQL中使用的函数,但更好的选择是使用参数.通常这样做如下.
你的SQL命令是:
SELECT * FROM PEOPLE WHERE SURNAME=?
然后,当你执行它时,你传入"O'Keefe"作为参数.
因为在设置参数值之前解析了SQL,所以参数值无法改变SQL的结构(如果你想用不同的参数多次运行相同的语句,它甚至会更快一些).
我还应该指出,虽然你的例子只会导致错误,但你可以通过不适当地转义字符串来解决许多其他问题.请参阅http://en.wikipedia.org/wiki/SQL_injection以获得一个好的起点或以下经典的xkcd漫画.