【python3】【pymysql】【blob】UnicodeDecodeError ‘utf-8’ codec can’t decode byte 解決する方法

pythonでpymysqlを使ってblobデータを取得するとbytesデータとして取得します。
テキストとして利用するためには一工夫必要になります。

pythonでpymysqlを使いblobのテキストデータを取得する方法は2通りあります。

pythonでpymysqlを使いblob(テキスト)を取得する方法

一つ目はMySQL内でblobをutf-8に変換する方法です。
この方法ではblobに入力されている最大テキスト文字数より
多くCHARを設定しなければ文字が削られます。
そのため最大文字数を考慮する必要があります。


import pymysql.cursors
with self.connection.cursor() as cursor:
sql ="SELECT CAST(text AS CHAR(10000) CHARACTER SET utf8) AS text FROM article"
cursor.execute(sql)
data = cursor.fetchone()
print(data['text'])

上記方法で取得しようとした場合blob内に不正な文字コードのデータがある場合
「UnicodeDecodeError ‘utf-8’ codec can’t decode byte」
エラーになります。

2つ目の方法はMySQLでそのままblobのbytesデータを
取得してデコードする方法です。


import pymysql.cursors
with self.connection.cursor() as cursor:
sql ="SELECT text FROM article"
cursor.execute(sql)
data = cursor.fetchone()
print(data['text'].decode('utf8'))

この方法でもblob内に不正な文字コードのデータがある場合
「UnicodeDecodeError ‘utf-8’ codec can’t decode byte」
エラーになります。

UnicodeDecodeError ‘utf-8’ codec can’t decode byteを解決する方法

MySQLでそのままblobのbytesデータを取得してからデコードするときにignoreで
もし文字化け等でエラーが発生した場合無視して取得する方法です。

下記コードにすれば不正な文字コードは除外されて取得することができます。
data['text'].decode('utf8', 'ignore')

厳密なデータでなければ
decode(‘utf8’, ‘ignore’)
にしたほうが安全でしょう。