为什么变量在`execute` SQL查询中需要单引号?

时间:2015-11-18 08:18:01

标签: sql ruby execute

鉴于name = "Ben",这不起作用:

DB.execute("SELECT id FROM departments WHERE name = #{name}")

但这样做(添加单引号):

DB.execute("SELECT id FROM departments WHERE name = '#{name}'")

为什么呢?为什么Ruby在第一个例子中没有调用变量?它已经是一个字符串了。我不明白为什么会有任何不同。这不等于传递"'Ben'"吗?这不等于传递"Ben"吗?

1 个答案:

答案 0 :(得分:3)

这不是Ruby问题,而是SQL语法问题。

WHERE name = tom 

WHERE name = 'tom'

是两件不同的事情。

在第一种情况下,它被视为一个模式对象名称(这里可能是一个列名),在第二种情况下它是一个字符串文字。

当您使用一种编程语言通过直接字符串操作为另一种编程语言(此处为Ruby - > SQL)创建程序时,您会遇到同样的问题。

正确的方法是使用绑定变量。

WHERE name = ?

这也涉及name包含特殊字符的问题。

name = "Little Bobby Tables, see http://xkcd.com/327/"