12
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

LaravelでMysqlのcharsetをutf8mb4にしてエラーが出るときの対応方法

Last updated at Posted at 2017-02-22

Laravel5.4からデフォルトの文字コードがutf8mb4になりました。
migrationでいきなり下記のようなエラーが出たりします。(MysqlのVersionや設定によるはず)

SQLSTATE[42000]: Syntax error or access violation: 1071 Specified
   key was too long; max key length is 767 bytes

カラムの文字数制限を255文字から191文字に変更して対処する方法もありますが、191ってなんだよみたいな気持ちがどうしてもあるので別の解決方法が以下。

my.cnf

[mysqld]
innodb_large_prefix
innodb_file_format=BARRACUDA
innodb_file_per_table

config/database.php

...
'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',
...

追記(2017/2/22 20:02)

はじめ

'engine' => 'InnoDB ROW_FORMAT=COMPRESSED',

と書きましたがversion 5.7.9以降のデフォルトがDYNAMICとのことなのでそれに合わせて修正しました。
※5.6ではmy.cnfでこの値をデフォルトに設定できないようなので注意。
(例えばlaravelのmigrationを使わず別のROW_FORMATで作成したテーブルが混在していた場合どうなるか等調べてません。)

12
18
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
12
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?