今天遇到一個詭異的 MySQL 問題:資料庫裡某張表突然在 phpMyAdmin 點擊「瀏覽」時直接報錯 Unknown column 'operator' in 'where clause order',提示找不到 operator 這個欄位。但我明明記得這張表以前確實有這個欄位,後來被刪除了,現在表結構裡也確實沒有了。既然欄位不存在,為什麼系統還要強行要求它?難道表裡沒有「毛澤東」這個欄位,也要報錯說缺少「毛澤東」嗎?
觀察 phpMyAdmin 的網址列,發現是用 GET 方式傳參。直覺認為可能是瀏覽器緩存把舊的 operator 條件殘留在 URL 裡,於是清理瀏覽器緩存後重試,但問題依舊。為了排除資料干擾,我甚至在 phpMyAdmin 的 SQL 執行框裡執行了 DELETE FROM `dj_driver_charge` WHERE 1; 清空資料,結果又報錯。錯誤訊息顯示執行的語句竟然變成了:
DELETE FROM `dj_driver_charge` ORDER BY operator LIMIT 1,25
明明我執行的是無條件刪除,系統卻自動加上了 ORDER BY operator。這個 operator 到底從哪冒出來的?
靈機一動,把報錯的紅字 SQL 複製到下方執行框,把 operator 換成一個現存的欄位(如 id),執行成功!此時再點「瀏覽」,錯誤神奇地消失了。
結論: 這極大概率是 MySQL 伺服器端的查詢緩存或 phpMyAdmin 的 Session 緩存殘留了舊的排序欄位資訊。當表結構變更(如刪除欄位)後,緩存未同步失效,導致後續操作仍嘗試使用已不存在的欄位進行排序。類似情況我之前遇過一次,當時以為表損壞直接重建,這次總算看清根因。
FLUSH TABLES 或重啟 MySQL 服務清除伺服器端緩存。這類「幽靈字段」錯誤看似詭異,實則是緩存失效的典型表現,冷靜分析請求鏈路即可快速定位。