MySQL で 2027 Malformed packet エラーが出る場合の解決ヒント
DjangoMySQL
2022-09-11 09:58 (4年前)

概要
Django で 生SQL を発行する際、特定の SQL で
File "<my-project>/.venv/lib/python3.9/site-packages/MySQLdb/connections.py", line 259, in query
_mysql.connection.query(self, query)
django.db.utils.OperationalError: (2027, 'Malformed packet')
が発生した。
環境
django = "==3.2.15"
mysqlclient = "==2.0.3" (2.1.1でも発生するのを確認した)
再現コード
発生するコードは次のようなもの
with connections['default'].cursor() as cursor:
sql = """SELECT status_id FROM order_status
WHERE order_status_name IN ("入金済み", "完了")"""
cursor.execute(sql)
print(cursor.fetchall())
この時、この SQL は結果が期待どおりではないものの完了し、次のSQL の発行時に
django.db.utils.OperationalError: (2027, 'Malformed packet')
このエラーが発生する。
解決方法
SELECT status_id FROM order_status
WHERE order_status_name IN ("入金済み", "完了")
この SQL 文で
order_status\nWHERE
となっている箇所の、改行の前後どちらかに半角スペースを入れるか、
"入金済み", "完了"
このダブルクォーテーションをシングルクオーテーションに変える。それで発生しなくなる。
MySQL では、ダブルクオーテーションは避けたほうが良い。
評価をお願いします (会員登録・ログイン不要)
まだ評価がありません
関連記事
Django で 2013, 'Lost connection to MySQL server during query' が出たので NO_ENGINE_SUBSTITUTION を無くした
mysql django.db.utils.InterfaceError: (0, '')
docker alpine 上で django を起動した時に django.db.utils.OperationalError: (2000, 'Unknown MySQL error')
MySQL 5.6 で、 ERROR 1265 (01000): Data truncated for column ... が出てSQLが実行されない
著者は、アプリケーション開発会社 Cyberneura を運営しています。
開発相談をお待ちしています。
開発相談をお待ちしています。