問題
文字列のあるカラムに対して、半角全角や大文字小文字を区別なく検索したい場合がある。
(例) ABC
で検索した場合に、ABC
や abc
もヒットしてほしい
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)}%") }