MySQLで文字コードを直す(文字化け)
起きたこと
- 1度目、ひどい文字化けが起きて、原因を解明するのにかなりの長い時を要しました。
- 2度目、PHP Laravelのマイグレーションを実行した時に、
default character set utf8mb4 collate 'utf8mb4_general_ci'
という記述がエラー文面の最後に含まれていて、ちょっとピンときました。(こちらは、my.cnfの設定が他にも必要だったみたいです。文字コードのみならずのエラーでした)
文字コードを確認します。
use <データベース名>; show variables like "chara%";
これで該当するデータベースの文字コード関連の変数が確認できます。
(MySQLインストールしたてで何も指定していない状態だと、 Latin
とかになってます)
こんな感じ。
MySQLでは、サーバー、データベース、テーブル、カラムなどにそれぞれ文字コードを設定できるのだそうな。 変更する方法は、設定ファイル(iniやcnf)で指定する、コマンドで変えるなど色々ある。
データベースの文字コードを変更する1(データベース作成時)
データベースの文字コードを設定するときの方法を以下に記しておきます。
データベースを作る時に、指定する場合は、 create database
するときに以下のようにします。
create database データベース名 default character set = utf8;
また先ほどの、
show variables like "chara%;
で意図した通りに設定できているか確認しましょう。
データベースの文字コードを変更する2(データベース作成後)
データベースをすでに作ってしまった後に変更したい場合は、ALTER文で変えます。
ALTER TABLE <テーブル名> DEFAULT CHARACTER SET utf8mb4;
サーバーの文字コードを変える
また、serverの文字コードを変えたい場合は、
mysql > set character_set_server = utf8;
の一文で変わる。
文字コード関連を全部一気に変えたい場合
そもそも最初から設定に書き込んでおく手もある。
まず、 mysql --help
を打つ。
これはmysql関連のコマンドのマニュアルを示してくれるコマンドであるが、これを打つと、途中に、configurationファイルのpathを示してくれる行が含まれている。
Default options are read from the following files in the given order: /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
こんな感じ。
前から順に読んでいくよ、といっているので、 /etc/my.cnf
に書くと良いだろう。
これらのファイルは、管理者権限でないと編集できない。
sudo vim /etc/my.cnf
とでもする。
区分けがあるが、これは、
[mysql]
と書くと、クライアントごとの設定として読み込んでくれる。
[mysqld]
と書くと、サーバー側の設定として読み込む。
基本は以下のような感じ。
[mysqld] # Password life time #default_password_lifetime = 0 # Time zone log-timestamps = system # TIMESTAMP explicit_defaults_for_timestamp = true # CHARACTER character-set-server = utf8mb4 collation-server = utf8mb4_general_ci innodb_file_per_table = 1 # LONGTEXT max_allowed_packet = 1GB innodb_log_buffer_size = 512MB innodb_log_file_size = 2GB
CHARACTER
の段落が文字コードの設定。
utf8mb4
というのは、昨今の絵文字のような4byte文字に対応できないということで新しくできた文字コード。
もともとalphabetだけを使っていた国々では、すべての文字が1byteで良かったが、
日本のひらかななどは、2byteや時折3byteの文字もあった。
それが、この頃は、海外でも絵文字利用が進んでおり、どこの国でも2byte, 3byte, 4byte文字に対応できるような文字コードの採用が進んでいるらしい。
my.cnf
の書き方のせいでエラーが起きたので、その時調べた注意するべき点については、こちらの記事に書きました。
MySQLの再起動
configurationファイルを編集した後は、mysqlを再起動するのをお忘れなく。
preferenceのmysqlというアプリケーションから stop/restart
できる。
terminalからは、
sudo systemctl restart mysqld.service
で再起動できる。
ちゃんと再起動できない場合、エラーが出る。
systemctl status mysqld
で、状態を確認しよう。
ここで、うまく再起動できない場合、 etc/my.cnf
の設定の仕方が何かおかしい場合がある。
エラーが出た場合は、
journalctl -xe
でエラーコードなどを確認できる。 実際に、設定がおかしくて、mysqlが再起動できなかった場合にジャーナルに表示されたエラーは、
mysqld.service: control process exited, code=exited status=1
こんな感じだった。
文字コードは、一度変えたのに、再度確認してみると、なぜか戻っているなんてことがザラにあるので、確認しながら確実に変更して行く必要がある。
主に同じことに苦しめられる可能性のある未来の自分への参考まで。
以上。