LoginSignup
1
2

More than 5 years have passed since last update.

Rails&MySQLの文字列型において大文字小文字を区別したい

Posted at

ユーザーが自分の記事に対して任意のカテゴリーを付与できる機能を実装しようとしたときの話。
モデルのバリデーション(:case_sensitive)は大文字小文字を区別しない設定(デフォルト)。

そしてtwitterというカテゴリーが既に登録してある状態でTwitterというカテゴリを登録しようとした際にエラーが発生しました。

どうやらMySQLはデフォルトだと文字列の大文字小文字を区別しない模様。
自分の実装している内容的には区別した上でDBに登録しておきたいので、何とかしたい。

Railsにおいて既存のカラムに大文字小文字を区別させる具体的な手順が見当たりませんでしたので、備忘録として残しておきます。

手順

マイグレーションを生成します。命名規則については今回のケースに合致するものが見つからなかったため、参考までに。

rails g migration ChangeCollationForCategoryNames 

大文字小文字を区別させるためには対象のカラムにBINARY属性を付与する必要があるのですが、Railsにそれを実現するメソッドが見当たらなかったため、executeで直接実行させます。

XXXXXXXXXXXXXX_change_collation_for_category_names.rb
class ChangeCollationForCategoryNames < ActiveRecord::Migration[5.0]
  def up
    execute("ALTER TABLE categories MODIFY name varchar(255) BINARY")
  end
end

マイグレーションを実施すれば完了です。

rake db:migrate

まとめ

DBによってこのような挙動の違いがあるのは結構怖いですね。
説明の不備・不足等ございましたら、ご指摘いただけますと助かります。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2