在SQL查询中转义单引号

时间:2011-11-18 08:43:11

标签: sql ruby-on-rails escaping

我有一个表companies,其中有两列名为nameaddress。通过运行以下代码,新数据将插入表中:

my_name = "my company name"
my_address = "ABC"

query = "INSERT INTO companies (name,address) VALUES ('#{my_name}','#{my_address}');"

ActiveRecord::Base.connection.execute(query);

如果我将my_name值从"my company name"更改为"John's company",我将收到语法错误。这是因为查询变为:

"INSERT INTO companies (name,address) VALUES ('John's company','ABC');"

'John's company'中有一个引号。

鉴于我已经为查询字符串定义使用了双引号,我如何摆脱关于我的值中单引号的错误?

1 个答案:

答案 0 :(得分:68)

如果您必须这样做,请使用连接对象上的quote method

  

引用(value,column = nil)
  引用列值以帮助防止SQL注入攻击。

这样的事情:

my_name    = ActiveRecord::Base.connection.quote("John O'Neil")
my_address = ActiveRecord::Base.connection.quote("R'lyeh")

query = "INSERT INTO companies (name,address) VALUES (#{my_name}, #{my_address})"

ActiveRecord::Base.connection.execute(query);

永远不要尝试处理自己的引用。并且不要尝试使用双引号来引用SQL字符串文字,这就是单引号的用途;双引号用于在大多数数据库中引用标识符(例如表名和列名),但MySQL使用反引号。