#はじめに
Dockerを使ってrailsでSNSアプリを作成していたところ、日本語をmysqlデータベースに保存しようとするとエラーがでてしまいました。原因を模索していると、mysqlの文字コードがデフォルトでlatin1になっていたためでした。
latin1は日本語未対応みたいですね。
参考:Latin-1のアスキーコード表
#mysqlの文字コードを日本語対応のutf8mb4に変更する
DockerHubからmysql公式イメージのDescriptionによると、
引用元:DockerHub mysqlについてのDescription
Configuration without a cnf file
Many configuration options can be passed as flags to mysqld. This will give you the flexibility to customize the container without needing a cnf file. For example, if you want to change the default encoding and collation for all tables to use UTF-8 (utf8mb4) just run the following:
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
本来mysqlの文字コードを設定する場合、mysqlを設定するcnfファイルを編集する必要があるが、cnfファイルの編集をせず、上記のようにコマンドを実行することでmysqlの文字コードをカスタマイズできるようですね。
#mysqlの文字コード設定方法
docker-compose.ymlファイルを以下のように編集しました。
version: '3'
services:
db:
image: mysql:5.7
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_DATABASE: with_exo_development
MYSQL_ROOT_PASSWORD: dbpass
MYSQL_USER: dbuser
MYSQL_PASSWORD: dbpass
ports:
- "3306:3306"
web:
build:
context: .
dockerfile: Dockerfile
command: /bin/sh -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
tty: true
stdin_open: true
depends_on:
- db
ports:
- "3000:3000"
volumes:
- .:/app
dbのcommand部分を追記しました。
#最後に
今回、文字コードをutf8ではなくutf8mb4にした理由は、絵文字もデータベースに保存できるようにするためです。