1. 程式人生 > >Mysql踩坑經歷

Mysql踩坑經歷

       今天下午收到同事反饋資料歸檔有一個任務失敗了,並且給我截圖錯誤資訊是BadSqlGrammarException,這個錯誤相信大家應該都見過,顯然是SQL語句裡面存在語法錯誤;但是,我的SQL怎麼會有問題呢!!我這麼穩的人…更何況其他歸檔任務都是用的這個SQL啊,不可能是SQL的問題啊。所以,我當時的第一反應就是是不是他喵的又把任務配錯了,或者是資料庫許可權的問題,然後就開始了漫長的定位過程。

     錯誤資訊:

    

       首先確認了任務配置是沒有問題的,並且看這個錯誤的樣子也不太像是許可權的問題。看了半天實在是看不出有什麼問題,於是使出了殺手鐗—本地除錯大法:在本地跑處理同一張表的任務,不跑不知道,一跑嚇一跳,結果居然是一樣的錯誤!!!納尼?我的系統居然有BUG!這簡直不能忍。但是,到底是怎麼回事呢?首先看錯誤描述,一個INSERT INTO 語句有一部分被截斷了,所以當時猜測是INSERT語句超長了,並且這張表字段也挺多的。然後為了驗證我的猜測,就隨意刪除了一部分欄位,重新試了,下果然就可以了。但是感覺這個也不是很科學,在我的印象中應該是有比這張表字段更多的都沒問題的。果然我又從後面刪除一些欄位試了下也不行,果然並不是這個問題。

      應該是某些特定欄位的問題吧,後來覺得;但是怎麼找到這個欄位呢?於是我使用了最原始的排除法了。逐個欄位進行刪除,然後重跑任務…終於,在刪除到一個名字為character欄位的時候,突然就可以了。我當時看到這個欄位的名字恍然大悟,這個好像是Mysql的關鍵字吧!當時真的想罵人…被坑死了有沒有。不過話說回來,即使別人使用關鍵字作為欄位名我們也得支援啊。於是,我想起了有一種寫法是SQL語句中欄位使用轉義符,類似`character`,試了一下果然可以哦。

     測試效果:

     不使用轉義符:

     

     使用轉義符:

     

    所以,結論是後續建表的時候,儘量不要使用關鍵字作為欄位名,避免坑害別人;寫SQL語句的時候欄位名都要使用轉義符,避免被別人坑害~~