我需要为我的表手动创建一个索引,因为rails / sqlite3因为collation hasn't been supported yet。
所以在我的迁移中我有:
## This doesn't work, so we'll do it manually
#add_index :events, :name, COLLATE: :NOCASE
execute <<-SQL
CREATE INDEX 'index_events_on_name' ON 'events' ('name' COLLATE NOCASE);
SQL
但显然索引没有被使用,我可以通过尝试使用表中的名称搜索事件来看到,但具有不同的情况。
如何让sqlite3和rails使用我创建的索引?
例如,如果我有一个名为“Fred”的事件,我搜索:
Event.where("name == ?",nameVar)
然后我可以在nameVar ==“Fred”时找到它,但不能在nameVar ==“fred”时找到它
答案 0 :(得分:1)
仅当搜索也使用此排序规则时,才使用COLLATE NOCASE索引。
时会发生这种情况
列本身以这种方式声明:
CREATE TABLE events( ... name TEXT COLLATE NOCASE ...);
或搜索显式使用不区分大小写的比较:
SELECT ... WHERE name COLLATE NOCASE = ?;
或者你正在使用LIKE,它隐含地不区分大小写:
SELECT ... WHERE name LIKE ?;
(注意模式字符.LELE的索引也要求列具有文本affinity。)