使用Active Record区分大小写的数据库搜索

时间:2018-09-18 07:11:57

标签: mysql ruby-on-rails activerecord

Active Record是否提供一种生成SQL的方法,该SQL强制文本搜索区分大小写?

被指示创建字符串类型列的Ruby-on-Rails生成器在VARCHAR(255)数据库中生成一个简单的mysql字段。原来是queries on such columns are case insensitive by default

因此,是Active Record搜索,例如:

Secret.where(token: 'abcde')

将匹配具有令牌abcdeABcdE等的记录。

无需更改底层数据库列(例如,指定utf8_bin归类),可以通过显式调整where子句使搜索区分大小写:

Secret.where('binary token = ?', 'abcde')

但是,这是特定于数据库的,我想知道Active Record是否有一个习惯用法可以对任何数据库完成相同的操作。例如,类似于where.not的构造:

Secret.where.binary(token: 'abcde')

这不是足够普遍的需求吗?

1 个答案:

答案 0 :(得分:0)

  

简而言之:区分大小写的ActiveRecord没有成语-敏感   搜索。

     
     

对于大小写(不敏感),您可以尝试使用   this。   它仍然有效,但是源代码有所更改。因此,在您的   自担风险。

通常,区分大小写是Collation惯用语的子集。 不同的DBMS对字符串(文本)数据类型使用非常不同的 default 归类,包括默认情况下的敏感性Detailed description for MySQL。

有一个SQL运算符COLLATE在DBMS中非常常见(但在SQL Standard中似乎仍然不存在)。 但是ActiveRecord源仅在模式创建代码中显示它。 ActiveRecordArel宝石在COLLATE搜索(悲伤)中都不使用where

注意:请不要错过问题中的数据库标签(mysql等)。 关于SO的许多问答没有标签(或带有sql的标签),这与的DBMS完全无关,除了作者的标签。