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 を 5.1 にアップグレードしたら、管理サイトの Inline で、プライマリーキーが表示される場所に `{'name': 'id', 'label': 'ID', 'help_text': '', 'field': 'id', 'is_hidden': True}` のような文字列が表示される場合の対応
django-allauth で、ソーシャルアカウントプロバイダーを決め打ちしてログインビュー・リダイレクトビューを返す (AWS Cognitoを使う時など)
MySQL でコレーションの違うフィールドで照合しようとして Range checked for each record が出た話
Django5にして依存ライブラリも更新したら、メール送信で SSL: CERTIFICATE_VERIFY_FAILED エラーが出るようになった
著者は、アプリケーション開発会社 Cyberneura を運営しています。
開発相談をお待ちしています。
開発相談をお待ちしています。