Laravel + MySQLでvarcharにBINARY属性をつけようと思ったら方法が分からなかったので次のように対応しました。

環境は以下の通りです。

  • Laravel 5.3
  • PHP 7
  • MySQL 5.7

なぜ?

MySQLはchar/varcharフィールドの検索で、通常アルファベットの大文字/小文字を区別してくれません。

例として、以下のデータが格納されているとします。

  • ユーザ1, token ABC
  • ユーザ2, token abc
  • ユーザ3, token aBc

そして次のSQLを実行すると、ユーザ1, 2, 3すべてヒットします。

SELECT * FROM users WHERE token = 'abc';

上記のようなケースで、アルファベットの大文字、小文字を区別するにはフィールドにBINARY属性を付加してあげます。

(iモードの公式サイトを開発していたような時代は[ドコモのUIDは大文字/小文字を区別しないとヤバイ]というのが当たり前でしたね。時代は変わったもんだ。)

マイグレーションファイルの書き方

スキーマビルダーには$table->binary()がありますが、こちらはblob型のフィールドを追加するもので、フィールドにBINARY属性を追加するオプションではありません。

ということで、Schema::createの後にでALTER TABLEを実行することで対処しました。

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('token');
    });
    DB::statement('ALTER TABLE users MODIFY token varchar(256) BINARY');
}

上のファイルを保存しphp artisan migrateでマイグレーションを実行すると、期待通りvarchar(255) utf8_general_civarchar(255) utf8_binになりました!

Laravelっぽい書き方をご存知の方がいらっしゃいましたら、ぜひ教えてください。

この記事はtomita@atuwebがお届けしました。


スポンサーリンク
ad_336
ad_336
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存
スポンサーリンク
ad_336
コメントの入力は終了しました。