MySQL で 2027 Malformed packet エラーが出る場合の解決ヒント

投稿者: ytyng 1年, 7ヶ月 前

概要

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 では、ダブルクオーテーションは避けたほうが良い。

現在未評価

コメント

アーカイブ

2024
2023
2022
2021
2020
2019
2018
2017
2016
2015
2014
2013
2012
2011