1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravel Sail での Tinker 使用時、日本語文字化け解消手順

Posted at

Laravel Sail で Tinker時の文字化け解消

課題

  • Laravel Sail環境でphp artisan tinkerを使った際の文字化けを解消したい

環境

  • Laravel11 (Sail)
  • Mysql8.0

なぜ文字化けするのか

Laravel Sailを使うと、Docker環境内でPHP・MySQLなどが動作します。
その際、デフォルトのMySQLやターミナルのロケール設定がUTF-8ではない場合、特に日本語などのマルチバイト文字を扱う時に文字化けが発生します。
Tinkerは、アプリケーション内部のテストやモデルファクトリで日本語を出力すると、MySQLのデフォルトエンコーディングやクライアントの文字コード設定が不十分な場合、ターミナル上で正常に表示されません。

解決

1. Sail の Dockerfileを編集する準備

Laravel Sailでカスタム設定を反映するには、デフォルトのSail構成ファイルをパブリッシュします。

sail artisan sail:publish

これでdocker/ディレクトリ以下にDocker用の設定ファイル群が生成され、自由にカスタマイズできます。

2. MySQL 設定ファイル(my.cnf)の追加

docker/使用中のdockerのversion/ ディレクトリ(例:docker/8.4/)内に my.cnf ファイルを作成し、以下の内容を記述します。

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
explicit-defaults-for-timestamp=1
general-log=1
general-log-file=/var/log/mysql/mysqld.log

[client]
default-character-set=utf8mb4

この設定により、MySQLサーバーとクライアントとのやり取りに常にutf8mb4が使用され、文字化けが防止できます。

3. docker-compose.yml の volumes に追記

docker-compose.yml のMySQLサービス定義部分にmy.cnfをマウントする設定を追加します。
例として、MySQLサービスが mysql という名前の場合:

services:
  mysql:
    # ...その他設定...
    volumes:
      - './docker/8.4/my.cnf:/etc/my.cnf'

これでコンテナ起動時にMySQLが上記設定を反映するようになります。

4. 再ビルド・再起動

設定を反映させるため、Dockerイメージの再ビルドとコンテナの再起動を行います。

sail build --no-cache
sail up -d

5. mysqlの確認

sail mysql でmysqlにログインし確認

結果

mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | utf8mb4                        |
| character_set_connection | utf8mb4                        |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | utf8mb4                        |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8mb3                        |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.01 sec)

再度、php artisan tinkerを実行し、日本語文字列が正しく表示されるか確認してください。

まとめ

MySQLとクライアント間の文字コード設定がUTF-8でなかったため、Tinker上での日本語が文字化けしていました。
my.cnfでutf8mb4を指定し、Docker Composeで適切なマウント設定を行うことで、文字化けを解消できます。
これらの手順を踏むことで、Laravel Sail環境でのTinker実行時に日本語が正常に表示され、開発効率やデバッグの快適さが向上します。

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?