【Python3】データがstrではなくbytesで返ってくる問題【MySQL】

PyMySQL3を使ってDB内のデータ取得をしたところ、varchar型に設定されたカラムのデータがbytes型で返ってきてしまう問題に遭遇。
後々のためメモ。

環境

Python 3.4.3
MySQL 5.6
PyMySQL3

解決策

PyMySQL3への接続とクエリは以下のような平凡なものである。

import pymysql

conn = pymysql.connect(params)
cur = conn.cursor()
cur.execute("SELECT id, name from some_table")
result = cur.fetchone()
print(result['name'])

ここでnameカラムがvarchar型だと、<class 'bytes'>として値が返ってきてしまった。

この問題を解決するためには、DBで定義されているカラムのcollation(照合順序)を変更する必要がある。

現在のcollationを確認するにはmysqlに接続、DBを選択し、

show table status;

を実行すればよい。

Name: some_table
(略)
Collation: utf8_bin

上記のように、collationがutf8_binになっているのがbytes型でデータが返却される原因のようだ。
というわけで下記を実行。

ALTER TABLE some_table COLLATE utf8_general_ci;
ALTER TABLE some_table MODIFY COLUMN name VARCHAR(255) CHARACTER SET `utf8` COLLATE `utf8_general_ci`;

これでカラムの設定と既存のデータがutf8_binからutf8_general_ciに変更された。

pythonに戻り再度実行すると、データがstrで返って来ていることが確認出来るはずである。

参考

python - PyMySQL returns bytes instead of str - Stack Overflow
馬場誠Blog(東京都世田谷区経堂のWebクリエイター)» ブログアーカイブ » 照合順序をutf8_general_ciからutf8_unicode_ciへ変更する