Spring BootのSQLファイルを使った初期化で、日本語の含まれるSQLファイルを実行したときに文字化けするときの対応

先日、Spring Bootを使ったプロジェクトでハマったことと解決策をメモしておきます。

やろうとしたことと

Spring BootのSQLスクリプトを使った初期化で、起動時にDBにテーブル作成・データinsertが行われるようにしたい。

https://spring.pleiades.io/spring-boot/docs/current/reference/html/howto.html#howto.data-initialization.using-basic-sql-scripts

ハマったこと

テーブル作成・データ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を実行の際、文字化けに悩んでいる方の参考になりましたら幸いです。