專案定時任務每日同步資料表至外部 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
VARCHAR(65535)(MySQL 5.7 前上限)。{"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 安全風險。import json
json_str = json.dumps(dict_obj, ensure_ascii=False) # 寫入
parsed = json.loads(json_str) # 讀取
JSON 格式標準、解析效能優於 ast.literal_eval,且不易產生單引號逸出問題。
TEXT/BLOB 型別。str(dict) 非標準格式。修正欄位長度並改用 JSON 後,線上異常徹底消失,同步任務恢復穩定。