先日、Spring Bootを使ったプロジェクトでハマったことと解決策をメモしておきます。
やろうとしたことと
Spring BootのSQLスクリプトを使った初期化で、起動時にDBにテーブル作成・データinsertが行われるようにしたい。
ハマったこと
テーブル作成・データinsertは行われるものの、日本語を含むレコードがある場合、文字化けしてしまう。
環境
- Spring Boot 2.3
- docker-composeを使ってAppサーバとDBサーバ(MySQL 5.7)を起動
やったこと
当初はスキーマ作成時の文字コード設定に問題があるのかと思い、docker-compose.ymlに
command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci
を定義したり、
my.cnfファイルを作成しマウントすることで、DB作成時に文字コードにutf8が定義されるよう設定。
[mysqld] character-set-server=utf8 collation-server=utf8_general_ci [client] default-character-set=utf8
コンテナ起動後にMySQLのコンテナにログインし、
show variables like '%char%';
でDBの文字コードを確認し、文字コードがutf8などになっていることは確認できている。
しかし、初期データを投入したテーブルを見ると、日本語が???と文字化けしている。
実行環境がmacOSだから?は聞いたことない。。。
SQLファイルのエンコーディングもUTF-8でBOM無しで作成されていることを確認。
手動で日本語の値を含めたレコードをinsert操作しても、日本語登録・表示される。
うーん…。
解決方法
DB側に問題がないとすると、実行側の問題では?と思い、起動時の設定を調査。
下記のパラメータに加え、
spring.profiles.active=profilename
spring.datasource.initialization-mode=always
spring.datasource.sql-script-encoding=UTF-8
を追加。
ビンゴ。
無事文字化けせずに登録ができました。
Spring Bootで実装したアプリケーションの起動時にSQLを実行の際、文字化けに悩んでいる方の参考になりましたら幸いです。