Ruby on Rails 日本語でフォーム投稿した際にIncorrect string valueエラー解決方法

# はじめに

# 環境
- Docker
- ruby 2.3.7
- Rails 5.2.4.4
- MySQL 5.7.32

# エラー内容
新規投稿フォームに日本語を入力し、送信するとIncorrect string valueエラーが発生。
![スクリーンショット 2021-01-04 21.28.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651278/562a60ee-c5ff-07d5-af49-b3b807a5b17e.png)

# 原因
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ファイルの文字コードの設定が抜けていたのが原因でした。

```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;
```

これで投稿フォームで日本語を送信することができるようになりました。

# 参考記事
- [MySQLのVARIABLESをコマンドから変更する](https://qiita.com/katsuyan/items/0c7ed34d9f8235b8363a)
- [dockerコンテナの中でviコマンドが使えないとき]
(https://blog.azimicat.com/entry/2019/09/12/docker%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E4%B8%AD%E3%81%A7vi%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%84%E3%81%A8%E3%81%8D)
- [MySQLで文字コードをUTF-8に変更できない](https://sakojun.work/posts/20200509_mysql%E3%81%A7%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92utf-8%E3%81%AB%E5%A4%89%E6%9B%B4%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84/)