LoginSignup
1
0

More than 3 years have passed since last update.

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

Posted at

はじめに

環境

  • Docker
  • ruby 2.3.7
  • Rails 5.2.4.4
  • MySQL 5.7.32

エラー内容

新規投稿フォームに日本語を入力し、送信するとIncorrect string valueエラーが発生。
スクリーンショット 2021-01-04 21.28.20.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;

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

参考記事

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0