技術 約2分で読めます

PowerShellからDocker上MySQLへマルチバイト文字を入れると文字化けする話

概要

Docker上のMySQLにテストデータを投入しようとしたら、日本語だけ文字化けする現象に遭遇した。

Claude Codeと開発していて、注意事項に書いても何度も同じミスをされるので、最終的にPHPスクリプト経由で投入する運用に変えて解決した。

結論から言うと、アプリの問題ではなくPowerShellのエンコード問題だった。

再現手順

Windows PowerShellで以下のようにSQLファイルを流し込む。

docker exec -i mysql mysql -u root -ppassword < seed.sql

SQLファイルはUTF-8で保存されているにもかかわらず、日本語が文字化けしてDBに格納される。

原因

Windows PowerShellのデフォルトエンコーディングがCP932(Shift_JIS)なので、リダイレクト(<)を使うとファイル内容がCP932に変換されてしまう。

UTF-8のSQLファイルでも、PowerShell経由でMySQLに渡す時点で文字コードが壊れる。

解決策

PHPスクリプト経由でHTTPリクエストからデータを投入する。

# 投入前のデータ確認
curl "http://localhost:8081/path/to/seed_runner.php?action=check"

# テストデータ投入
curl http://localhost:8081/path/to/seed_runner.php

PHP側でSQLを実行すれば、文字コード変換の問題を回避できる。

やってはいけないこと

  • docker exec mysql < file.sql でSQLを流し込む
  • 文字化けを見たら即座にアプリの文字コード処理を疑う

文字化けの原因は意外なところにあることが多い。今回のケースでは、アプリ本体は一切悪くなかった。

おまけ

本体はちゃんと動いてるのに、ダミーデータを入れるだけでトークンを消費するのは馬鹿らしい。回避できるなら安易な手段だろうがなんだろうが回避した方が精神的に良い。