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すべてヒットします。

1SELECT * FROM users WHERE token = 'abc';

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

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

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

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

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

1public function up()
2{
3    Schema::create('users', function (Blueprint $table) {
4        $table->increments('id');
5        $table->string('token');
6    });
7    DB::statement('ALTER TABLE users MODIFY token varchar(256) BINARY');
8}
9

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

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


PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応

竹澤 有貴,栗生 和明,新原 雅司,大村 創太郎
出版社:ソシム  発売日:2018-09-26

Amazonで詳細を見る

PHPフレームワーク Laravel入門

掌田津耶乃
出版社:秀和システム  発売日:2017-09-16

Amazonで詳細を見る

初めてのPHP

David Sklar
出版社:オライリージャパン  発売日:2017-03-18

Amazonで詳細を見る