2015-01-16

在 MySQL 的 int 型別欄位插入空字串

建立以下的 table。
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。
---
---
---

3 則留言:

  1. 我都直接預設給他null說,在寫入時,先判斷是不是為空值,再決定寫入

    回覆刪除
    回覆
    1. 理論上應該,每次 insert 都要檢查。
      但是我在這個專案遇到的情況比較特別(好像每個專案都說自己很特別),非必填欄位卻設成 Not Null,因為是既有專案,所以只能照辦。
      到底是應該向我上面那樣,透過設定讓錯誤永遠不會發生,還是像你說的,每個欄位去檢查,前者的好處是不會出錯,但資料不能完全表現使用者的選擇,後者剛好相反,好處是可以完全儲存使用者的選擇,但要很小心仔細處理每個 int 欄位,只要漏掉一個就不知道哪天會出錯。

      刪除
    2. 對於資料的嚴謹度上,比較建議使用後一種會比較好,這樣資料才不會出現重大的錯誤及可能的漏洞(有切身之痛呀)
      畢竟出錯之後,也比較好排查問題在哪,而不是東找西找,然後才看到罵自己笨

      刪除