親バカエンジニアのナレッジ帳

webのエンジニアをやっており、日頃の開発で詰まったことや書き残しておきたいことを載せています。育児のイロハという育児サイト(https://ikujip.jp)の開発も行っているため、その開発で使用されている技術についても掲載しています。

Spring Boot + MySQLで絵文字を保存する

絵文字を保存したい

スマホが普及してから絵文字を文中に入れるのはもはや普通のことですよね。
掲示板などでも絵文字を入力できるものは増えていますよね。

Webアプリの開発者の中には絵文字を入力できるフォームを作りたいという人もいるのではないでしょうか?
実はこれ、意外と簡単なのです。

ここではSpring BootとMySQLを使っている場合の絵文字の保存方法を共有したいと思います。

MySQL文字コードを変更

普段データベースを設定する時、文字コードは何を使っていますか?
大体utf8を使うことが多いですよね。
普通の文字列であればそれでも構いませんが、絵文字を登録する場合はutf8を拡張したutf8mb4を使う必要があります。

文字コードを変更するためにはmy.cnfファイルに変更を加えます。
※my.cnfファイルの場所は環境によって異なってくるのでご自身で調べてもらう必要があります。
Macの場合は「/usr/local/etc/」直下、Linuxの場合は「/etc/my.cnf」あたりになるかと思います。

以下のように「character-set-server」と「default-character-set」の値を変更してください。

my.cnf

[mysqld]
character-set-server = utf8mb4

[client]
default-character-set = utf8mb4

設定変更後、MySQLを再起動させれば文字コードが反映されます。
反映されていることを確認するために、MySQLにログインした後に以下のコマンドを入力し、各文字コードが以下のようにutf8mb4になっていることを確認してください。

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     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)

この状態でデータベース、ひいてはテーブルを作成すればMySQLに絵文字を登録できます。
実験的に以下の絵文字を何らかのカラムに登録してみてください。

😀

※注意点として、データベースやテーブルを新しく作成する場合に、utf8mb4以外の文字コードを使用しないでください。
MySQLサーバの文字コードはutf8mb4だけどカラムの文字コードはutf8の場合などはもちろん絵文字は登録できません。

また、utf8で作成していた既存のカラムをutf8mb4に変更したい場合、MySQLサーバの文字コードを変えてもカラムの文字コードは変わっていないので注意してください。

Spring Bootでデータベース接続時の文字コードを変更

あとはSpring Bootでデータベースに接続する時の文字コードを変更する必要があります。
変更するファイルは環境変数を書き込んでいるapplication.ymlかapplication.propertiesです。

以下は変更前と変更後を並べますが、変更後ではデータベースの接続で文字コードを指定しています。
※データベース名は「test-database」であるとします。

application.ymlの場合 <変更前>

spring:
  datasource:
    url: jdbc:mysql://localhost/test-database

application.propertiesの場合 <変更前>

spring.datasource.url=jdbc:mysql://localhost/test-database


application.ymlの場合 <変更後>

spring:
  datasource:
    url: jdbc:mysql://localhost/test-database?character_set_server=utf8mb4

application.propertiesの場合 <変更後>

spring.datasource.url=jdbc:mysql://localhost/test-database?character_set_server=utf8mb4

これでSpringBootより絵文字が登録できるはずです。

まとめ

いかがでしたか?
設定自体は簡単ですよね。
ちなみに以下のサイトも同じことをして絵文字を登録しています。
会員登録なしで書き込みなどできるので、ぜひ試してみてください。

ikujip.jp

Spring Boot 2 プログラミング入門

Spring Boot 2 プログラミング入門

Spring Boot in Action

Spring Boot in Action