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

标签 mysql ruby-on-rails activerecord

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

指示创建字符串类型列的 Ruby-on-Rails 生成器在 mysql 数据库中生成一个简单的 VARCHAR(255) 字段。结果是 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')

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

最佳答案

In short: there is NO ActiveRecord idiom for case-sensitive search.


For case-insensitive search you can try to use this. It still works, but source code was changed a bit. So, use it on your own risk.

通常,区分大小写是 Collation 的子集成语。 不同的 DBMS 对字符串(文本)数据类型使用非常不同的默认 排序规则,包括默认大小写敏感性Detailed description用于 MySQL。

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

注意: 请不要在问题中遗漏数据库标签(mysql 等)。 SO 上有许多没有标签(或带有 sql 标签)的问题和答案,它们与大多数 DBMS 完全无关,除了作者的。

关于mysql - 使用 Active Record 区分大小写的数据库搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52380860/

相关文章:

PHP删除用户收藏夹

sql - 如何解决必须具有唯一名称的外键约束?

javascript - RegExp\A\z 不起作用,但这正是 Rails 4 所需要的

jquery - Rails 3.1 实时预览

ruby-on-rails - 安装 eventmachine (1.0.3) 时出错

ruby-on-rails - Rails:NameError(未初始化的常量 ActiveRecord::RecordNotUnique)

php - 如果在循环中使用 MySQLi 准备语句,我什么时候调用 bind_param?

javascript - 实现 Ajax/Jquery

ruby-on-rails - 从 ActiveRecord 中的模型中获取范围

ruby-on-rails - 在 Ruby 中转换只有一个对象的数组