Laravelでハマったcharset:utf8mb4

Laravelでハマったcharset:utf8mb4

最近Laravelでのプログラミングに明け暮れてます。
おかげでブログの更新が疎かになってますが、完成したプログラムはきっと皆さまのお役に立つものであろうと思います。

そのプログラムの中でハマった個所の備忘録です。

そもそもcharsetって何?

10年前くらいから楽天市場とお付き合いのある店舗さんならお分かりだと思います。

charsetとは文字コードの事ですね。

弊社の出店した6年前ではあまり言われなくなっていたそうですが、私は何度かコールセンターで『charset』を力説されました。
「エクセルで作成したデータは『Shift_jis』、楽天市場へのCSV更新は『utf8』で行ってください。データはAccessで作成してください。Excelはダメです。」
今でこそなくなりましたが、10年前の楽天市場ではExcelで更新したデータが上手く表示されないという事案が多発していたそうです。

ネットワーク上の情報は最終的には0と1の羅列です。
これらにルールを作って文字や図を表しているわけですが、charsetとはこの文字のルールの事です。
Excelの標準の文字ルールは『Shift_jis』、でも楽天市場の更新仕様は『utf8』で作成していたから文字化けになったという事です。

utf8mb4 は絵文字も可能にした文字コードの事

スマホが流通し【絵文字】の文化が定着してきました。
そこで、従来の文字コードでは対応しきれないと考え新しいルールを作った。それがutf8mb4です。
そのため絵文字を利用できますが、1文字当たりの容量が今までの倍の4バイトとなりました。

モールでは文字数制限がありますので、扱える文字の量が減ったと認識いただいてOKです。

モール出品アプリを作成している私からするとこの現象は大問題。
なぜなら使える文字数がモールの要件よりも少なくなる可能性があるからです。
システムはモールの仕様に合わせなきゃ使えないですよね。

だから従来のutf8に変更したかったのですが、ここで大ハマりしたわけです。

Laravel の文字コード指定ヶ所は複数ある

ググると出てくる情報で最も多いものは【my.cnf】の書き換えです。

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

innodb_large_prefix
innodb_file_per_table
innodb_file_format=Barracuda

character-set-server=utf8
collation-server=utf8_unicode_ci

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# Recommended in standard MySQL setup
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 

port=13306

[mysql]
default-character-set = utf8

[client]
default-character-set = utf8


[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

このように『utf8mb4』を『utf8』に書き換えて再起動&マイグレーション実行!

上手くいく方はこれだけで解決するようですが、私はダメでした。

 config/database.php を確認

色々ググってテストした結果、Laravelの config/database.php を変更して解決しました。

'connections' => [

'sqlite' => [
'driver' => 'sqlite',
'database' => env('DB_DATABASE', database_path('database.sqlite')),
'prefix' => '',
],

'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', ⇒ 'utf8',に変更
'collation' => 'utf8mb4_unicode_ci', ⇒'utf8_general_ci',に変更
'prefix' => '',
'strict' => true,
'engine' => null,
],
  ],

こんなところにも設定があったんですね。

マイグレーションの結果も良好。

ツール作成頑張ります。

 

\ 最新情報をチェック /

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください