为什么变量在 `execute` SQL 查询中需要单引号?
Why do variables need single quotes in `execute` SQL query?
鉴于 name = "Ben"
,这不起作用:
DB.execute("SELECT id FROM departments WHERE name = #{name}")
但这确实如此(添加了单引号):
DB.execute("SELECT id FROM departments WHERE name = '#{name}'")
为什么?为什么 Ruby 不调用第一个例子中的变量?它已经是一个字符串。我不明白为什么这会有什么不同。那不就相当于通过了"'Ben'"
吗?这不等同于传递 "Ben"
吗?
这不是 Ruby 问题,而是 SQL 语法问题。
WHERE name = tom
和
WHERE name = 'tom'
是两个不同的东西。
在第一种情况下,它被视为模式对象名称(这里大概是列名),在第二种情况下,它是一个字符串文字。
每当您使用一种编程语言通过直接字符串操作为另一种编程语言(此处 Ruby -> SQL)创建程序时,您 运行 就会遇到同样的问题。
正确的方法是使用绑定变量。
WHERE name = ?
这也解决了 name
包含特殊字符的问题。
name = "Little Bobby Tables, see http://xkcd.com/327/"
鉴于 name = "Ben"
,这不起作用:
DB.execute("SELECT id FROM departments WHERE name = #{name}")
但这确实如此(添加了单引号):
DB.execute("SELECT id FROM departments WHERE name = '#{name}'")
为什么?为什么 Ruby 不调用第一个例子中的变量?它已经是一个字符串。我不明白为什么这会有什么不同。那不就相当于通过了"'Ben'"
吗?这不等同于传递 "Ben"
吗?
这不是 Ruby 问题,而是 SQL 语法问题。
WHERE name = tom
和
WHERE name = 'tom'
是两个不同的东西。
在第一种情况下,它被视为模式对象名称(这里大概是列名),在第二种情况下,它是一个字符串文字。
每当您使用一种编程语言通过直接字符串操作为另一种编程语言(此处 Ruby -> SQL)创建程序时,您 运行 就会遇到同样的问题。
正确的方法是使用绑定变量。
WHERE name = ?
这也解决了 name
包含特殊字符的问题。
name = "Little Bobby Tables, see http://xkcd.com/327/"