St_Hakky’s blog

Data Science / Human Resources / Web Applicationについて書きます

MySQL:文字コードについて

こんにちは。

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

これでもう一度文字コードを確認してutf-8になっていたら勝ち。

○絵文字への対応

普通の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になっていると思いますが、これはデフォルトで変更されないようになっているようです。