Python+MySQLで開発時に「UnicodeDecodeError: 'utf-8' codec can't decode byte 0x83 in position 113: invalid start byte」

ここまで、下記2つのエントリーを進めてきた。

・「Python+SQLAlchemy+MySQLでORマッピング
Python+SQLAlchemy+MySQLでORマッピング 〜 select

ここでハマった。次のエラーが発生するが原因が分からない。

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x83 in position 113: invalid start byte

何故わからないのかというと、ソースコードを何度見直しても、「Python+SQLAlchemy+MySQLでORマッピング 〜 select」で実施したソースコードと次の点のみを除いて同じだから。

◎相違点
・DBの接続先指定部分「url = 'mysql://ユーザ名:パスワード@IPアドレス/DB名?charset=utf8'」における「DB名」が異なる
・select対象のテーブルが異なる。

ファイルの文字コードもデータベースの文字コードも同じ「utf8」。いったい何故エラーとなるのか全く分からない。

とりあえず、文字コードを「utf8」にしていることが原因のようだから、接続先を次のように修正してcharset指定を外す。
これでは日本語をブラウザやコンソールに出力させる時に文字化けするが原因究明のためにトライ&エラー。

◎変更前
url = 'mysql://ユーザ名:パスワード@IPアドレス/DB名?charset=utf8'

◎変更後
url = 'mysql://ユーザ名:パスワード@IPアドレス/DB名'

するとエラーが発生しなくなった。


正直困ったので、ログを遡ると次のようになっている。

2017-01-13 18:36:31,877 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `テーブル名`
2017-01-13 18:36:31,877 INFO sqlalchemy.engine.base.Engine {}
2017-01-13 18:36:31,904 INFO sqlalchemy.engine.base.Engine ROLLBACK
Exception during reset or similar
Traceback (most recent call last):

・・・・・・・・・・・

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x83 in position 113: invalid start byte

どうやらsqlalchemyのクラスで「SHOW CREATE TABLE `テーブル名`」が実行されているようなので、エラーが発生しない場合のテーブルと、エラーが発生する場合のテーブルの2つに対して「SHOW CREATE TABLE `テーブル名`」を実行してみた。
するとエラーが発生するテーブルだけテーブルコメント、カラムコメントが文字化けする・・・。

'CREATE TABLE `テーブル名` (
 `カラム` int(11) DEFAULT NULL COMMENT '��茋�ʁ@���A�s�o���A�L�����Z���Ȃ�'
) ENGINE=MyISAM AUTO_INCREMENT=17731 DEFAULT CHARSET=utf8 COMMENT=''�l�b�e�B���O�����e�[�u��'''

(どこの会社がやったのかは知っているが)一体どこの馬鹿がこんなことにしたのかと思いながら、泣く泣くカラムコメントとテーブルコメントを空文字に修正。
(※)今回コメントは不要なので空文字に修正。

・テーブルコメントの修正
Alter table テーブル名 COMMENT '';

・カラムコメントの修正
ALTER TABLE テーブル名 CHANGE COLUMN カラム名 `カラム名` datetime NOT NULL COMMENT '';

こうして動いた!!!!!!!!