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/ |
+--------------------------+----------------------------+
実行
こうですね〜(ドットインストール風)