CREATE TABLE int_test ( id int(11) NOT NULL AUTO_INCREMENT, cnt int(11) DEFAULT '0', PRIMARY KEY (id) );然後插入空字串到 int 型別的 cnt 欄位。
insert into int_test (cnt) values ('');結果得到 [Err] 1366 - Incorrect integer value: '' for column 'cnt' at row 1。
但是見鬼的正式機不會出錯,只有我的測試機唉唉叫!
沒關係,有 Google。
今天長知識,MySQL 有個東西叫做 Strict mode,在嚴格模式下,不能插空字串到 int 裡,但是非嚴格的爽爽模式就可以。
打開 my.ini,找到 STRICT_TRANS_TABLES,我的 MySQL 5.1.33-community 預設如下:
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"拿掉 STRICT_TRANS_TABLES 就好,變成
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"重新啟動 MySQL,空字串就會變成可愛的 0。
---
---
---
我都直接預設給他null說,在寫入時,先判斷是不是為空值,再決定寫入
回覆刪除理論上應該,每次 insert 都要檢查。
刪除但是我在這個專案遇到的情況比較特別(好像每個專案都說自己很特別),非必填欄位卻設成 Not Null,因為是既有專案,所以只能照辦。
到底是應該向我上面那樣,透過設定讓錯誤永遠不會發生,還是像你說的,每個欄位去檢查,前者的好處是不會出錯,但資料不能完全表現使用者的選擇,後者剛好相反,好處是可以完全儲存使用者的選擇,但要很小心仔細處理每個 int 欄位,只要漏掉一個就不知道哪天會出錯。
對於資料的嚴謹度上,比較建議使用後一種會比較好,這樣資料才不會出現重大的錯誤及可能的漏洞(有切身之痛呀)
刪除畢竟出錯之後,也比較好排查問題在哪,而不是東找西找,然後才看到罵自己笨