【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へ変更する