ハマログ

株式会社イーツー・インフォの社員ブログ

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’,」が必要でした。

character setDBLaravelMariaDBmysqlutf8mb4エンコードキャラクターセット文字コード文字化け

  Shin.A   2017年6月22日


関連記事

Laravel EloquentのソートでNULLを最後に持ってくる(MySQL)

Laravel5系+MySQL5のはなし。 Laravel+Eloquentのプ…

Laravel6へのアップグレードで Call to undefined function str_slug()

はじめに 少し前にLaravel6がリリースされました。Laravel5.5で動…

PHPのcurlを卒業して、Guzzleを使う。の巻

PHPでHTTP通信するときに、PHP組み込みのcURL(Client URL …


← 前の投稿

次の投稿 →