Mysql使用規範-----建表

一、 MySQL建表,字段需設置爲非空,需設置字段默認值。

        原因是沒啓用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時看過的。

從應用層php角度來看,可以減少程序判斷代碼,比如你要插入一條記錄,如果沒默認值,你是不是得先判斷該字段對應變量是否被設置,如果沒有,你得通過php把該變量置爲''或者0,否則這條insert語句會報異常,如果設了默認值,該部判斷可直接略過


二、 MySQL建表,字段需NULL時,需設置字段默認值,默認值不爲NULL。
        爲什麼mysql字段要設置爲not null?
        首先 我們創建一個表 user字段爲允許null,age字段爲允許null    都無默認值 age設定默認值Empty String
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `user` varchar(45) default NULL,
  `age` varchar(45) default '',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
        然後導入2條數據
INSERT INTO `test`(age) VALUES ('10');
INSERT INTO `test`(user) VALUES ('zhangsan');

然後仔細觀察


可以看到 給了默認值的age默認爲  而uesr沒給默認值則爲Null

下邊我們來執行查詢

首先查詢用戶爲空的

然後查詢年齡爲空的

爲什麼user我空查不到 而age同樣爲空確能查到呢?

如果你使用的是java等強類型語言那麼你很容易理解 ,而使用php等若類型語言就需要注意了

請注意 MYSQL不是PHP,NULL不等於空字符串 更不會做類型轉換!

而我們使用做WEB開發的時候,有的地方插入記錄 是指定空字符串,有的地方插入記錄沒有指定值,如果字段設置默認值,那麼查詢的時候只需要 select * from test where user =‘’即可 所以MySQL建表,字段需NULL時,需設置字段默認值,默認值不爲NULL。 默認爲0同理


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章