質問: ### 前提・実現したいこと SpringBoot + ThymeleafでWebアプリを開発中です。 機能としては ブラウザに入力フォームを配置し 入力された値をDBに登録、そして 登録されたデータ達をブラウザ上で一覧表示させるというものです。 以下のような流れです。 ・STSで開発したコード類を実行可能JARとしてビルドし、これをcloudfoundry(Pivotal)にデプロイ ・cloudfoundryではcleardbのサービス(MySQL)を利用。 ・デプロイしたアプリとDBサービスをバインドし、アプリを起動 ・無事に起動に成功したが、日本語データを入力・登録しようとすると全ての日本語(全角文字)データが「?」に置き換えられ、文字化けが発生 ちなみに文字化けしたのはフォーム入力を経由しているものだけで、 HTMLに直接打ち込んだ日本語や、 thymeleafの変数式に直接代入(フォーム入力値ではなく、事前にコードに書いておいた固定の文字列)した文字列(日本語)は 文字化けしていません。 現在文字化け解消に向けて試行錯誤中です。 ### 発生している問題・エラーメッセージ ``` 同じアプリをローカル環境(ローカルのMySQL)で起動した所、 日本語データも問題なく登録・表示されました(読み込んでいるpropertiesファイルはapprication.propertiesです)。 また、cleardbのサービスインスタンスに対して ローカルと同じようにコマンドプロンプトからアクセスし、 以下の事を試しました。 手入力で日本語のデータを登録し、これをデプロイしたアプリ上から確認。 このデータは文字化けせずに日本語のまま表示されていました。 したがって、入力フォームに記入した値をDBに引き渡す過程で何か問題がある可能性があると考えています。 それがthymeleafの変数式によるものなのか、リポジトリによるものなのか分かりません。 文字化けに関して自分なりに色々調べ試してみましたが未だに解消には至っておりません。 ちなみに、 コマンドプロンプトにて確認したcleardbのMySQL文字コードは以下の通りです。 ローカル環境と違って設定ファイルをいじって文字コードを変える事ができなさそうなので悩んでいます。 +--------------------------+------------------------------+ | Variable_name | Value | +--------------------------+------------------------------+ | character_set_client | cp932 | | character_set_connection | cp932 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | cp932 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql56/charsets/ | +--------------------------+------------------------------+ また、参考までにローカルDBの文字コードは以下の通りです。 +--------------------------+---------------------------------------------------------+ | Variable_name | Value | +--------------------------+---------------------------------------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | C:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ | +--------------------------+---------------------------------------------------------+ ``` ### 該当のソースコード ``` #以下の内容はapprication-cloud.propertiesのもの。 #springboot1.4からspring.datasource.connectionPropertiesは使えなくなった模様。 #代わりに↓を記述。 spring.datasource.tomcat.connection-properties=useUnicode=true;characterEncoding=UTF-8; spring.datasource.tomcat.driver-class-name=com.mysql.cj.jdbc.Driver #datasource系 spring.datasource.sql-script-encoding=UTF-8 #thymeleafの設定 spring.thymeleaf.encoding=UTF-8 spring.thymeleaf.mode: HTML #EMBEDDED(埋め込み)tomcatの設定? server.tomcat.uri-encoding=UTF-8 #これがCharacterEncodingFilterに相当する設定? spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true spring.http.encoding.force=true ``` ### 試したこと 各ファイルのtext file encoding の確認(UTF-8) application-cloud.properties内での設定の見直し(上記参照) ### 補足情報(言語/FW/ツール等のバージョンなど) [OS] win10 [開発言語] Java [開発環境] STS3.9.0. SpringBoot1.5.7. Thymeleaf3.0.2. [デプロイ先] PivotalCloudFoundry(Pivotal Web Services) [使用DB] Cleardb MySQL(CloudFoundryのサービスインスタンス) ### 追記 ``` clearDBのMySQLサービスインスタンス内の文字コード (win10コマンドプロンプト経由で確認。) 【データベースの文字コード】 mysql> show create database データベース名 ; +--------------------+-----------------------------------------------------------------------------+ | Database | Create Database | +--------------------+-----------------------------------------------------------------------------+ | データベース名 | CREATE DATABASE `データベース名` /*!40100 DEFAULT CHARACTER SET utf8 */ | +--------------------+-----------------------------------------------------------------------------+ 1 row in set (0.19 sec) 【テーブルの文字コード】 mysql> show create table テーブル名; +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | テーブル名 | CREATE TABLE `テーブル名` (カラム定義) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 | +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.17 sec) 【ビューの文字コード】 mysql> show create view ビュー名; +------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ | View | Create View | character_set_client | collation_connection | +------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ | ビュー名 | ビューの生成規則 | utf8 | utf8_general_ci | +------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ 1 row in set (0.20 sec) ```
回答: mysql://hostname:port/database?useUnicode=true&characterEncoding=utf8 とかちゃんとしてる? あと CREATE TABLE 実行時、CREATE DATABASE 時にDEFAULT CHARSET を UTF8にしてる? 追記 === 文字コード設定の優先順位 1. カラム指定の文字コード 2. テーブル指定の文字コード 3. データベース指定の文字コード 4. システム指定の文字コード 文字コード未設定の場合は データベース作成時に未指定の場合はシステムの設定を引き継ぎ テーブル作成時に未指定の場合はデーターベース(上記)の設定を引き継ぎ カラム作成時に未指定の場合はテーブル(上記)の設定を引き継ぎ 多分以下のように取得したのをどこかで設定しているとおもうので ``` { "jdbcUrl": "jdbc:mysql://us-cdbr-iron-east-05.cleardb.net/***********?user=***********&password=***********", "uri": "mysql://***********:***********@us-cdbr-iron-east-05.cleardb.net:3306/***********?reconnect=true", "name": "***********, "hostname": "us-cdbr-iron-east-05.cleardb.net", "port": "3306", "username": "***********", "password": "***********" } ``` どこかで設定しているはずですよ