laravel5.5は、最初から絵文字対応していた(mysqlの文字コードはutf8mb4の一択!)
laravel5.4から、デフォルトの文字コードがutf8からutf8mb4に変わったらしい。
config/database.phpで設定されている(.envで変更するようにしてもいい)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_bin', // .envで変更するようにしてもいい。 //'charset' => env('DB_CHARSET', 'utf8'), //'collation' => env('DB_COLLATION', 'utf8_general_ci'), 'prefix' => '', 'strict' => true, 'engine' => null, ], |
問題は、laravel5.1の時に使っていたconfig/database.phpや.envファイルをコピペしたり、laravel本体のバージョンアップした時はutf8のままで、スマホから絵文字を入力されると
mysqlの文字コードがutf8のままなので、INSERT時にエラー画面になってしまう。
1 2 |
Illuminate \ Database \ QueryException (HY000) SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xF0\x9F\x98\xAB' for column 'カラム名' at row 1 |
基本的には、文字コードをutf8mb4に設定してから初期化してあげればOK!
1 |
php artisan migrate:fresh --seed |
ただ、テスト運用中で気楽に初期化できない場合は、特定のカラムだけ文字コードを変更する事も出来る
※照合順序(COLLATE)も文字コードに紐付いているから、同時に変更しないとダメ!
1 |
ALTER TABLE テーブル名 MODIFY カラム名 カラムの型 CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'ここでコメントを書かないとコメントそのものが削除される'; |
テーブルの文字コードを変更しようとしたら、リレーション貼っているカラムがあるからダメ!と怒られた…。
1 2 |
ALTER TABLE テーブル名 CONVERT TO CHARACTER SET utf8mb4 #1832 - Cannot change column 'unique_id': used in a foreign key constraint 'テーブル名_unique_id_foreign' |