mariaDBのcharacter_set_clientがlatin1のせいで文字化け

環境

  • mariaDB
  • character_set_client
  • latin1
  • character_set_connection
  • centOS7
  • node.js

 

説明

slackのチャットを受け取ってdbに保存したかったのですが、mariadbのcharacter_set_clientがlatin1のせいで日本語が文字化けしてしまいました。テーブルの設定は問題なくutf-8だったので、若干困りましたが、直接my.cnf を編集してみれば、無事slackのチャットから受け取ったメッセージを日本語のままmariaDBに保存することができました。

ここによれば、どうやら「character_set_client」 と 「character_set_connection」 「character_set_results」の3つはクライアントがクエリを送信し、 クエリ結果を受信するときのキャラクタセットを設定するらしいですね。

今回の場合クライアントっていうのはスラックであり、スラックから受け取った私のcentosってことになります。「character_set_client」 と 「character_set_connection」 「character_set_results」の3つがlatin1ってことは、centosから送信されたクエリはutf8として認識されず、日本語が?になるってことですね。テーブルの設定はがutf-8とか、問題はそこではなかったということでした

mariDBの状態

show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

一回サーバーに戻ってmy.cnfを編集する

sudo vim /etc/my.cnf

追記するのは、下記の一文だけ

*注意:余計に設定を増やしたりしたら、エラーになりました。また、書き込む場所によっても結果が変わるのかな?謎の動きが多いので注意が必要かもです。

[client]
default-character-set = utf8

編集後はこんな感じ

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in https://fedoraproject.org/wiki/Systemd
character-set-server=utf8

[client]
default-character-set = utf8                                                                                                                                                         

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

mariaDB再起動

systemctl stop mariadb

systemctl start mariadb

mariaDBに入ってみてDBの状態を確認

おお〜いい感じ

show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

実行

こうですね〜(ドットインストール風)

スクリーンショット 2017-10-09 21.54.52.png

参考

MySQL5.6のmy.cnfの基本設定

藤沢瞭介(Ryosuke Hujisawa)
  • りょすけと申します。18歳からプログラミングをはじめ、今はフロントエンドでReactを書いたり、AIの勉強を頑張っています。off.tokyoでは、ハイテクやガジェット、それからプログラミングに関する情報まで、エンジニアに役立つ情報を日々発信しています!

未整理記事