Laravelでutf8mb4対応
MySQLで絵文字を扱おうと、utf8からutf8mb4に変更して試す機会がありました。
開発はLaravel(5.4)なのですが、Laravelは5.4からutf8mb4がデフォルト(?)になったのですね。ただMySQLのバージョンにもよるようですが、テーブルのmigrationでこんなエラーが出たりするというのもネットに見受けられます。自分も当たり前にぶち当たりました。
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 byte
他の案件で同様のエラーに直面したので、my.cnfの設定に以下
character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci innodb_large_prefix innodb_file_per_table innodb_file_format=barracuda
を追加したりしましたが、もう一つの肝、テーブルのROW_FORMATを”DYNAMIC“にするには、Laravelではどうすれば良いのかわかりませんでした。
が、/config/database.phpのを以下のようにしたところ、migrationにて生成されるテーブルで”ROW_FORMAT=DYNAMIC”となりました。
'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'hoge'), 'username' => env('DB_USERNAME', 'hoge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => 'InnoDB ROW_FORMAT=DYNAMIC', ],
最後の「’engine’ => ‘InnoDB ROW_FORMAT=DYNAMIC’,」が必要でした。