首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python "EOL while scanning string literal" 錯誤根因與解決:資料庫欄位截斷導致字典字串不完整

     編輯:更多程式設計知識

專案定時任務每日同步資料表至外部 API,線上環境頻繁拋出 EOL while scanning string literal,本地與測試環境卻正常。經排查發現:資料庫 VARCHAR(65535) 欄位存儲 str(dict) 序列化字串,實際資料超長導致截斷,產生單引號不配對的殘缺字串,eval()/ast.literal_eval() 解析時拋出語法錯誤。

錯誤重現

>>> eval('{"name":"orang')
  File "", line 1
    eval('{"name":"orang')
                     ^
SyntaxError: EOL while scanning string literal

根因分析

  1. 資料表欄位定義 VARCHAR(65535)(MySQL 5.7 前上限)。
  2. 字典序列化後長度超過 65535 字元,寫入時被靜默截斷。
  3. 讀取時得到 {"name":"orang 這類不完整字串,eval() 解析失敗。

解決方案

方案一:擴充欄位型別(推薦)

ALTER TABLE `log_table` MODIFY `data_col` LONGTEXT CHARACTER SET utf8mb4;

LONGTEXT 上限 4GB,徹底解決截斷問題。

方案二:程式端防禦性處理

import ast, logging
def safe_parse(s):
    try:
        return ast.literal_eval(s)
    except (SyntaxError, ValueError) as e:
        logging.warning("資料解析失敗,已略過: %s", e)
        return {}
  • 改用 ast.literal_eval 避免 eval 安全風險。
  • 捕獲異常並記錄,避免單筆髒資料中斷整批處理。

方案三:改用 JSON 序列化

import json
json_str = json.dumps(dict_obj, ensure_ascii=False)   # 寫入
parsed = json.loads(json_str)                         # 讀取

JSON 格式標準、解析效能優於 ast.literal_eval,且不易產生單引號逸出問題。

最佳實踐總結

  1. 資料庫欄位預留充足長度或採用 TEXT/BLOB 型別。
  2. 序列化統一採用 JSON,避免 str(dict) 非標準格式。
  3. 資料讀取層加入防禦性解析與異常記錄,確保單筆錯誤不影響整體流程。

修正欄位長度並改用 JSON 後,線上異常徹底消失,同步任務恢復穩定。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved