こんにちは。
MySQLで取り扱う文字コードについて色々調べたこととかについてまとめたので、以下備忘録として残しておきたいと思います。
○文字コードの変更
以下の様な感じのエラーが出た時の対処方法
sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (1366, "Incorrect string value: '\\xE9\\x98\\xBF\\xE4\\xBA\\x95...' for column 'name' at row 1") <|| まず、何の文字コードを使っているかどうかを確認する。 >|| show variables like "chara%";
ちなみに、使用可能な文字コードは以下のコマンドで確認することができる。
show character set;
次に、文字コードを全てutf-8にするために、以下のコードをmy.cnfに追加。centosだと、/etc/my.cnfにある。
[mysqld] character-set-server=utf8 [client] default-character-set=utf8
その後、再起動をかける。
sudo service mysqld restart
○絵文字への対応
普通のutf8だと、1文字あたり1〜3バイトなんですが、一部の漢字とか絵文字が4バイトなんですね。なので、普通にブログとかのサービスを作ったとして、普通に絵文字をぶち込まれると普通に死にます。
これは、「寿司ビール問題」とかっていうこともあるそうです(utf-8絵文字の中でも寿司とビールのアイコンが同値判定されてしまう問題のことをさすそうです)。
これに対応するのが、4バイトにも対応するutf8mb4で、設定をすれば普通のutf8も4バイトのutf8も扱えるようになります。これは、MySQL 5.5から対応しているようです。
設定方法なのですが、さっきと同じくだりになります。こちらの資料によると、今から始めるならutf8mb4らしいっす。確かに、、、
文字コードを全てutf8mb4にするために、以下のコードをmy.cnfに追加。centosだと、/etc/my.cnfにある。
[mysqld] character-set-server=utf8mb4 [client] default-character-set=utf8mb4
その後、再起動をかける。
sudo service mysqld restart
これで、文字コードを確認してちゃんと設定されていればオッケー。
ちなみに、既存のDBなどの文字コードを変更する方法もあります。
まず、データベースのcharsetを変える方法は、以下のコマンドになります。
ALTER DATABASE <database_name> CHARSET utf8mb4;
これは、実行しても既存のテーブルのCharsetは変更されません。以後で作成するテーブルが全てutf8mb4になるだけです。
そのため、既存のテーブルの文字コードを変更したい場合は、以下のコマンドを実行します。
ALTER TABLE <table_name> CHARSET utf8mb4;
上のコマンドも、テーブル属性だけ変換します。なので、もしテーブル内の全てのカラムとデータの変換を行いたい場合は、以下のコマンドを行います。
ALTER TABLE <table_name> CONVERT TO CHARSET utf8mb4;
カラム名の文字コードを変更したい場合は、以下のコマンドを実行する。
ALTER TABLE <table_name> MODIFY <column_name> VARCHAR(100) CHARSAET utf8mb4;
ちなみに、character_set_systemだけutf8になっていると思いますが、これはデフォルトで変更されないようになっているようです。