はじめに
環境
- Docker
- ruby 2.3.7
- Rails 5.2.4.4
- MySQL 5.7.32
エラー内容
新規投稿フォームに日本語を入力し、送信するとIncorrect string valueエラーが発生。
原因
Incorrect string valueのエラー文から、フォームに入力した文字列が原因と推測。
試しに英語を入力して送信すると問題なく投稿できました。
ということは、DBが日本語に対応していない?
MySQLに接続し、使用中のデータベースの設定を確認。
mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
DBの文字コードの設定がutf8ではなく、latin1になっていました。
latin1は、西ヨーロッパ言語で日本語対応していないらしいです。
Docker環境構築時にdatabase.ymlファイルの文字コードの設定が抜けていたのが原因でした。
default: &default
adapter: mysql2
# ここに「charset: utf8」が抜けてたのが原因
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: hideki1104
host: db
解決方法
etc/mysql/my.cnfのファイルに
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_bin
skip-character-set-client-handshake
[mysqldump]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
を記述すると文字コードが変更できます。
viエディタを使用して記述を追加しようとしたが、viコマンドが設定されておらず使えない
# vi my.cnf
/bin/sh: 5: vi: not found
apt_getを使用すればvimをインストールできるらしい。
# apt-get -v
apt 1.8.2.2 (amd64)
下記のコマンドで一旦アップデートを行い
# apt-get update
vimをインストールします。
# apt-get install vim
これでvimを使用できるようになりました。
etc/mysql/my.cnfに先ほどの
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_bin
skip-character-set-client-handshake
[mysqldump]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
を記述することで文字コードを変更できました。
この状態ではすでに作成しているすでにDB、テーブル、カラムの文字カードは変更されていません。
MySQLの中で以下のコマンドを打ち込みました
DBの文字コード設定
ALTER DATABASE DB名 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
テーブルの文字コード設定
ALTER TABLE テーブル名 CONVERT TO character SET utf8mb4 COLLATE utf8mb4_unicode_ci;
カラムの文字コード設定
ALTER TABLE テーブル名 CHANGE column_name カラム名 VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
これで投稿フォームで日本語を送信することができるようになりました。