はじめに
こんにちはSREエンジニアのMakiです。
この記事ではMySQLをセットアップする前に注意してほしいことについて紹介します。
MySQLを使ってアプリケーションを構築しようとしている方の参考になれば幸いです。
キーワード
MySQL5.6
,Ubuntu 16.04
,Oracle Linux 7
,my.cnf
,文字化け
,文字コード
,utf8
,latin1
MySQL をインストールするその前に
まず、先に結論を言いますと、MySQLをインストールする際には必ず OSのサポートバージョンを確認
しましょう。
これをしておかないと何が起きるか。
当然ですが、MySQLを開発している人たちが本来意図していない問題が起きる可能性があります。
例えば、文字コードの設定が反映できないなど。
私はこの確認を怠ってMySQLのセットアップをしたために、Webアプリの文字化けが解消できずに時間を浪費しました。
下記のページにMySQLのバージョンとOSのサポート状況のマッピングが記載されていますので必ず
確認しましょう!
https://www.mysql.com/support/supportedplatforms/database.html
MySQL 5.6をubuntu 16.04 にインストールしようとしたら...
MySQL 5.6
を使ったWebアプリケーションの開発環境を用意しようとしておりハマりました。
もともと用意されていた手順書にはDBの条件はMySQL5.6を利用とだけ書かれていたので、そこで、普段使い慣れているubuntu 16.04
にセットアップしようとして作業を実施していたのです。
MySQLのインストールと,Webアプリケーションの設定自体はうまく行ったのですが、動作確認をしていてデータが文字化けしていることが発覚。調べてみると、文字コードの設定は my.cnf
というファイルで設定できることがわかりました。
my.cnfを設定してみる
ubuntu 16.04 の場合のパス: /etc/mysql/my.cnf
my.cnf
に設定を加えるとデフォルトの文字コードが変更されるといろんなサイトに書いてあったので実際に試してみました。
設定内容
[client]
default-character-set=utf8
[mysqld]
collation-server=utf8_general_ci
init-connect='SET NAMES utf8'
character-set-server=utf8
skip-character-set-client-handshake
[mysql]
default-character-set=utf8
参考にしたページ
https://stackoverflow.com/questions/3513773/change-mysql-default-character-set-to-utf-8-in-my-cnf
文字コードを確認してみると。
mysql> show variables like "chara%";
+--------------------------+----------------------------+
| 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 | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
character_set_server
が latin1
となっています。
これだと文字化けしてしまいます。
DBを再起動してみましたが、、、
character_set_server
はそのまま。変更されていません。
SQLで設定してみる
他にも以下のコマンドを実行することで回避できるという記載もありました。
mysql> set character_set_server = utf8;
Query OK, 0 rows affected (0.01 sec)
このやり方は、一時的に文字コードを変更することができるのですが、再起動で元に戻るので、文字コードの問題解消には繋がりませんでした。
Oracle Linux 7.7 を使って再セットアップを実施
ここで、セットアップしている環境がおかしいのではないかと考え、OSとサポートバージョンを確認することに。
https://www.mysql.com/support/supportedplatforms/database.html
MySQL 5.6 と Ubuntu 16.04 の組み合わせは○がついていません。
ここで初めてOSとの相性の問題に気づきました。。
MySQLのバージョンを上げるわけには行かなかったので、Oracle Linux 7 を使ってMySQL5.6 をセットアップすることにしました。
セットアップは以下のサイトを参考に実施。
https://weblabo.oscasierra.net/installing-mysql-rhel6-with-yum/
Oracle Linux 7.7 にセットアップした場合の my.cnf のパスは/etc/my.cnf
でした。
ここにubuntu のときと同様に文字コードの設定を書きました。
[client]
default-character-set=utf8
[mysqld]
collation-server=utf8_general_ci
init-connect='SET NAMES utf8'
character-set-server=utf8
skip-character-set-client-handshake
[mysql]
default-character-set=utf8
再起動して確認してみます。
mysql> show variables like "chara%";
+--------------------------+----------------------------+
| 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/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
character_set_server
含めすべての文字コードが utf8
になっていることが確認できました。
まとめ
MySQLのセットアップ方法はいろんなサイトにナレッジがあるので簡単にできると思うかもしれません。
しかし、その前にきちんとOSとMySQLのサポートバージョンをしっかりと確認しましょう。
サポートされている組み合わせでないと、良からぬ動作が発生したときに問題の解決に時間がかかる恐れがあります。
私もこの基本的なことに気づかず作業をしてしまったので、かなりの時間を無駄にしました。
コメント