ProgateでRuby on Railsレッスンで、tweetappというものを作成したので、そのコピーをDockerとGithubを使いながら、開発をしています。
ちなみにRails環境は以下のページを参考に構築しました。
https://qiita.com/reflet/items/f73cac406760ee4ecc13
感謝です(^^)
しかし、新規投稿機能のところで、日本語の文字列をDBに保存できない問題に直面。
エラー文は全文は控えてなかったのですが以下のような感じで、文字コードが原因っぽい。
Mysql2::Error: Incorrect string value ,,,,,,
いろいろネットで調べて以下の方法で解決したので、メモです。
#MySQLのクライアントサーバーとMySQLサーバーの文字コードの確認・変更
#確認したいテーブルを選択
mysql> use DB名
#文字コードを確認
mysql> show variables like 'character%';
+--------------------------+----------------------------+
| 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 | latin1 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
#以下のコマンドでUTF-8に変更
mysql> set character_set_client = utf8
mysql> set character_set_connection = utf8
mysql> set character_set_database = utf8
mysql> set character_set_results = utf8
「character_set_server」「character_set_system」は「docker-compose.yml」のMySQLにcommandを以下のように追加したらUTF-8に変更できました。
command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
#既に作成したDBの文字コードの確認・変更
#確認
mysql> show create database DB名;
+----------+--------------------------------------------------------------------+
| Database | Create Database |
+----------+--------------------------------------------------------------------+
| example | CREATE DATABASE `example` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+--------------------------------------------------------------------+
#変更
mysql> alter database DB名 character set utf8;
#既に作成したMySQLのテーブルカラムの確認・変更
#確認
mysql> show create table テーブル名 \G;
*************************** 1. row ***************************
Table: posts
Create Table: CREATE TABLE `posts` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`content` text CHARACTER SET latin1,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
#変更
mysql> alter table テーブル名 modify カラム名 varchar(255) character set utf8;
この時点で日本語に保存できました。
いやーハマっちゃいましたw
これから、カラムを追加したり、新しいテーブルを作成するので、どうなるのでしょうか。
とりあえず進めていきます。