Rails + MySQL で半角全角区別なく検索したい #rails #mysql

問題

文字列のあるカラムに対して、半角全角や大文字小文字を区別なく検索したい場合がある。

(例) ABC で検索した場合に、ABCabc もヒットしてほしい

COLLATION を使う

MySQL の場合、照合順序(COLLATION)の設定で実現できる。

charset が utf8mb4 の場合、utf8mb4_unicode_ci を使う。

COLLATION 大文字小文字 半角全角
utf8mb4_general_ci 区別しない 区別する
utf8mb4_unicode_ci 区別しない 区別しない
utf8mb4_bin 区別する 区別する

COLLATE 句を使う

テーブルやカラムに対しても設定できるが、 COLLATE 句を使うことで、SQL レベルで照合順序を上書きすることが可能。

これにより影響範囲を局所的にできる。

SELECT *  
FROM  
    sample  
WHERE 
    -- WHERE で COLLATE を指定する
    name LIKE '%Alice%' COLLATE utf8mb4_unicode_ci;

Rails で使う

Ruby On Rails で使う場合、 scope を用意してあげればよさそう。

scope :fuzzy_matching_by_name, ->(name:) { where('name LIKE ? COLLATE utf8mb4_unicode_ci', "%#{sanitize_sql_like(name)}%") }

参考