我一直在使用MySQL嚴格模式啓用的網站上工作。一個人有一個很長的用戶代理字符串,它記錄在我們的日誌表中,不幸的是用戶代理字符串超出了列的限制,從而引發了警告。數據根本沒有插入。我應該禁用MySQL嚴格模式嗎?
爲了避免這樣的麻煩,我應該禁用MySQL嚴格模式還是應該自己提出一些東西(我正在使用PHP)?
我一直在使用MySQL嚴格模式啓用的網站上工作。一個人有一個很長的用戶代理字符串,它記錄在我們的日誌表中,不幸的是用戶代理字符串超出了列的限制,從而引發了警告。數據根本沒有插入。我應該禁用MySQL嚴格模式嗎?
爲了避免這樣的麻煩,我應該禁用MySQL嚴格模式還是應該自己提出一些東西(我正在使用PHP)?
在將數據插入數據庫之前驗證數據。如果字符串太大而不適合您的表格,那麼您的列太窄或數據無效。您需要決定是否在存儲它之前截斷它,執行一些錯誤報告,或者兩者兼而有之。
做不是關閉您的DBMS的安全功能,這是完全錯誤的事情要做。
我希望你可以把更大膽的「不」。如果你能把MySQL的嚴格性轉化爲11,那將是很好的。 – 2011-04-03 08:31:38
我並沒有覺得服務器模式是一種安全功能。雖然我猜這取決於你對安全功能的定義 – ChrisWue 2011-04-03 08:33:32
@ChrisWue:我會打電話給「沒有默默地修改你的數據」的安全功能。 – 2011-04-03 08:41:46
好吧,這取決於你嚴格模式禁用,看看事情是如何工作的,我從來沒有遇到與它禁用的問題,但要小心。
但是,如果長時間的用戶代理是嚴格模式的唯一問題,並且您沒有直觀地讀取它們,那麼我推薦只對您的UA進行散列或增加字段長度。
你寧願讓你的數據被自動截斷(可能導致破損的數據),或者你至少想知道你有問題嗎?
我建議保持嚴格的模式啓用和邊界檢查您的PHP中的數據。您的PHP應用程序知道或至少應該知道如何處理太長的字符串。如果你關閉了嚴格模式並且把這個決定留給MySQL,那麼MySQL將會悄悄地截斷你的字符串,並且你最終會得到一個充滿垃圾的數據庫。
更改和修復代碼很容易,修復損壞的數據通常是不可能的。
如果禁用了嚴格模式,你會喜歡這個奇怪的問題結束了:
你可以將其插入之前檢查字符串的應用水平長度。 – 2011-04-03 08:29:23
@Pekka:你會如何合理地做到這一點?我不想在軟件的任何地方調用方法。 – Tower 2011-04-03 08:31:08
好吧,你大概不得不在任何地方逃避傳入的數據。一個'substr()'可以工作,不會增加太多混亂。如果你的應用程序使用嚴格模式,否則(這很好),我會走這條路,並保持原樣 – 2011-04-03 08:33:55