疑問的原因是沒啟用MySQL的嚴格模式(strict mode),很多快捷開發環境自帶的MySQL(PHPnow WAMP Appserv等),都沒有啟用嚴格模式,甚至是在一些產品環境(production environment)都忽略了這點。
非嚴格模式下,MySQL會容忍許多開發上的疏忽,例如把一個長度100的字串插入到varcaht中只會截斷多餘的部分而不報錯。嚴格模式對資料的格式、長度、型別等進行校驗,你貼出的建表語句中指定了DEFAULT,如果此時不指定DEFAULT,在你認為會啟用預設值的時候會返回#1364錯誤。
開發階段最好啟用嚴格模式,這是對我們程式碼嚴謹性的測試,嚴進寬出也能保證轉移到產品環境和後續的資料庫遷移、重構順利。
為什麼資料庫要設定預設值呢?因為我們希望在插入資料時,有意或無意間被忽略的欄位能夠交由MySQL按你事先預想的方式處理,例如一些預設正常狀態碼、使用者插入資料時候尚未設定的文字欄位,諸如此類。
我的習慣是任何資料表的任何列都是非空(NOT NULL),在此基礎上將數字預設設為0,文字預設設為""(在PHPMyAdmin中留空)。這裡涉及一個NULL和""的區別,對此我所知尚少,我使用""的原因是根據語義NULL表示“此欄位值為空”,而""表示“此欄位暫未設定值”。另一個原因是在MyISAM引擎下,NULL對索引、索引統計、磁碟佔用都會有額外的開銷,一個允許為NULL的列,每個欄位的長度都比NOT NULL的多1bit,我不確定最近幾年是否有所改善,涉及到NULL的資料大概是在MySQL5.0時看過的。
疑問的原因是沒啟用MySQL的嚴格模式(strict mode),很多快捷開發環境自帶的MySQL(PHPnow WAMP Appserv等),都沒有啟用嚴格模式,甚至是在一些產品環境(production environment)都忽略了這點。
非嚴格模式下,MySQL會容忍許多開發上的疏忽,例如把一個長度100的字串插入到varcaht中只會截斷多餘的部分而不報錯。嚴格模式對資料的格式、長度、型別等進行校驗,你貼出的建表語句中指定了DEFAULT,如果此時不指定DEFAULT,在你認為會啟用預設值的時候會返回#1364錯誤。
開發階段最好啟用嚴格模式,這是對我們程式碼嚴謹性的測試,嚴進寬出也能保證轉移到產品環境和後續的資料庫遷移、重構順利。
為什麼資料庫要設定預設值呢?因為我們希望在插入資料時,有意或無意間被忽略的欄位能夠交由MySQL按你事先預想的方式處理,例如一些預設正常狀態碼、使用者插入資料時候尚未設定的文字欄位,諸如此類。
我的習慣是任何資料表的任何列都是非空(NOT NULL),在此基礎上將數字預設設為0,文字預設設為""(在PHPMyAdmin中留空)。這裡涉及一個NULL和""的區別,對此我所知尚少,我使用""的原因是根據語義NULL表示“此欄位值為空”,而""表示“此欄位暫未設定值”。另一個原因是在MyISAM引擎下,NULL對索引、索引統計、磁碟佔用都會有額外的開銷,一個允許為NULL的列,每個欄位的長度都比NOT NULL的多1bit,我不確定最近幾年是否有所改善,涉及到NULL的資料大概是在MySQL5.0時看過的。