プログラミングは面白い

プログラミングの事を中心に色々書いていきます

【ブログ開発】日本語がデータベースに入らない【mysql】

いやはや、いざ開発するとなると本当に色々起きるから大変。
なんかもう逆に楽しくなってきた。

投稿画面を作って、タイトルと本文がDBに保存出来るかテストをしてみました。
test、testと入力して保存をすると成功します。
しかし!
テスト あああああああああああああああああ
とすると、Mysql2::Error: Incorrect string value:なんちゃらかんちゃらとエラーを吐きます。

いやいや、そんなバカな。
そんなわけないっしょ。
何かの間違いだと思い色んなパターンで試したところ、やっぱり日本語ではじかれます。
日本語というより2バイト文字ですかね。

Progateではこんな事おきなかったやん…としょぼくてれいても誰も助けてくれません。
そう、ここは開発という名の大海原!
自分で調べて解決しなければ前に進めないのです!

てことで、グーグル先生にいっぱい教えてもらいました。

まず、どうやらmysqlの初期の文字コードがutf8になっていないのが原因のようでした。
rails dbコマンドでmysqlにログインします。
statusコマンドを入力すると、下記のような部分があります。

# 略
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
# 略

私の場合は最初、こんな感じでした。
このlatin1ってヤツが今回の敵です。

で、解決方法なのですがmysqlのmy.iniファイルを編集する事で解決出来ます。
macだとmy.confなのかな?私は現在windows環境なのでmacは分からないです。
ちなみに、私の環境下ではC:\ProgramData\MySQL\MySQL Server 5.7の中にいました。
ProgramDataは隠しフォルダです。

んで、この中の[mysql]と[mysqld]という項目にcharacter-set-server=utf8の一文を追記しました。
これを追記したらmysqlを再起動します。
statusで確認をしてみると…

# 略
Server characterset:    utf8
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
# 略

serverはutf8になったようなのですが、DBがlatin1のままでやっぱり2バイト文字が入りません。
なんでやー、とさらに調べてみたところ、どうやら最初にlatin1で作ったDBはそのまま引き継がれてしまうようです。
途中で変更する方法があるのかもしれませんが、テストデータしか入っていないので私はDBを削除して作りなおしました。

DB作り直してハッとしたのですが、カラムも全部消えちゃってるんですよね。
でもmigrateファイルあるしそのままmigrateしたらいけるのかな?と思い、テストがてらやってみたらちゃんとDBにカラムが反映されました。
おーすげー便利ー、ってちょっと一人で感動してました。

新規に作り直したDBはちゃんとcharactersetがutf8になっていて、2バイト文字もばっちり受け付けてくれました!
いやー、ちょっとした事でもわざわざこうやって設定しないといけないんですねー。
ビックリしました。

でも今回はいい勉強になった!
備忘録して残しておきます。

参考サイト

qiita.com

qiita.com