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 '';
こうして動いた!!!!!!!!