在ActiveRecord(使用Ruby on Rails),如果我有@products
变量,其中@products = Product.all
,我说:
@products.where("name = 'check123' ")
,它返回一个数组的对象匹配的条件,如果我去@products.where('name="check123"')
我得到一个错误?
: SELECT "products".* FROM "products" WHERE (name = "check123")
Hirb Error: PG::UndefinedColumn: ERROR: column "check123" does not exist
LINE 1: SELECT "products".* FROM "products" WHERE (name = "check123"...
^
为什么会发生这种情况?似乎我必须始终使用双引号在where子句和单引号内的任何字符串周围的一切?
单引号不应该在这里工作,或者有什么我没有得到
其他观察:
@products.where("cost = '23.0'")
工程,事件虽然23有整数而不是字符串的数据类型?@products.where('cost = 23')
工作,所以我知道我可以在where子句
注意:我知道使用'?'语法在where子句中以避免sql注入,我有目的地尝试像这样执行查询。
双引号用于命名数据库对象(表名,列名,用户名,模式名…),而单引号用于表示字符串作为值。
所以你的UndefinedColumn: ERROR
是有意义的,当用@products.where('name="check123"')
过滤时,生成的SQL将是.... where name = "check123"
。db引擎正在尝试查找名称为check123
的列,并将其值与列name
的值进行匹配。由于列check123
在您的表中不存在,您将得到"未定义的列名"错误。
对于您的其他问题:
当你用字符串值过滤一个整数列时,db引擎会隐式地将列值转换为字符串来执行搜索。
更新通用SQL标准由这个问题的答案描述。总之,大多数Db引擎遵循大多数ANSI标准,双引号的使用通常是为数据库对象保留的。