日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql char null_关于mysql设置varchar 字段的默认值''和null的区别,以及varchar和char的区别...

發布時間:2025/4/5 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql char null_关于mysql设置varchar 字段的默认值''和null的区别,以及varchar和char的区别... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、背景

根據業務需求,發現以前的同事在設計表的時候,很多字段都沒有設置默認值。在mysql5.7版本之后,沒有設定默認值的字段,在嚴格模式下是很容易報錯的,所以我這邊需要先給每個字段加上一個默認值。

對于常見的int類型,默認值為0就好,但是對于varchar類型呢,默認值是設置為”還是Null呢?

二、‘’和null的區別

1、占用空間問題

(1)c語言:

'\0',這個表示空,需要消耗存儲空間的。

NULL,則表示連這個\0都沒有。

(2)、mysql:

1:空值('')是不占用空間的

2: MySQL中的NULL其實是占用空間的。官方文檔說明:

“NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.”

可見為了表示某個字段是否為空是需要額外開辟空間存儲Null值,而在C語言中空值’不占用存儲空間。

不僅如此,不使用NULL可以提高索引效率,因為樹形索引結構中將NULL也視作一般數據節點。

2、上面說到了null會影響索引效率

其實我們在初學mysql的時候,都會看到一段話,那就是mysql建議字段最好為不要為null,盡量為not null。

原話:

盡量避免NULL:應該指定列為NOT NULL,除非你想存儲NULL。在MySQL中,含有空值的列很難進行查詢優化。因為它們使得索引、索引的統計信息以及比較運算更加復雜。你應該用0、一個特殊的值或者一個空串代替空值。

null會影響索引的統計,一般會默認null為同一個值,這樣這個索引的篩選價值就降低了,影響優化器的判斷。當然也可以調整參數,使得null被認為是不同的值。

結論:也就是說,在設置默認值的時候,盡量不要用Null來當默認值,用空字符串(”)會更好一些。帶有null的默認值還是可以走索引的,只是會影響效率。當然,如果確認該字段不會用到索引的話,也是可以設置為null的

三、在統計時,”和null的區別

這部分建議參考博客:

MySQL 中NULL和空值的區別

結論:

1:在進行count()統計某列的記錄數的時候,如果采用的NULL值,會別系統自動忽略掉,但是空值是會進行統計到其中的。

2: 判斷NULL 用IS NULL 或者 is not null,SQL 語句函數中可以使用ifnull()函數來進行處理,判斷空字符用 =''或者 <>''來進行處理

3: 對于MySQL特殊的注意事項,對于timestamp數據類型,如果往這個數據類型插入的列插入NULL值,則出現的值是當前系統時間。插入空值,則會出現 '0000-00-00 00:00:00'

4:對于空值的判斷到底是使用is null 還是 =''要根據實際業務來進行區分。

四、關于char和varchar的選用

1、定義

眾所周知的,char是定長,而varchar是變長。

char(M)類型的數據列里,每個值都占用M個字節,如果某個長度小于M,MySQL就會在它的右邊用空格字符補足.(在檢索操作中那些填補出來的空 格字符將被去掉)在varchar(M)類型的數據列里,每個值只占用剛好夠用的字節再加上一個用來記錄其長度的字節(即總長度為L+1字節)。

2、哪個更合適

對于MyISAM表,盡量使用Char,對于那些經常需要修改而容易形成碎片的myisam和isam數據表就更是如此,它的缺點就是占用磁盤空間;

對于InnoDB表,因為它的數據行內部存儲格式對固定長度的數據行和可變長度的數據行不加區分(所有數據行共用一個表頭部分,這個標頭部分存放著指向 各有關數據列的指針),所以使用char類型不見得會比使用varchar類型好。事實上,因為char類型通常要比varchar類型占用更多的空間, 所以從減少空間占用量和減少磁盤i/o的角度,使用varchar類型反而更有利。

3、結論

1、在確定字段為短小且定長的時候,用char會好一些

2、在某字段需要頻繁改寫的時候,用char會好一些(因為varchar每次存儲都要有額外的計算,得到長度等工作,如果一個非常頻繁改變的,那就要有很多的精力用于計算,而這些對于char來說是不需要的。)

3、設計varchar()值的時候,不要一股腦的都用varchar(255):mysql會把表信息放到內存中(查詢第一次后,就緩存住 了,linux下很明顯,但windows下似乎沒有,不知道為啥),這時內存的申請是按照固定長度來的,如果varchar很大就會有問題。

4、關于varchar(255)和varchar(256) :根據mysql官方文檔,varchar(255)需要一個字節記錄字段的長度 256以上需要兩個字節記錄長度。設置長度超過256會有點浪費。

5、因為在業務中使用innoDB多一些,所以盡量還是用varchar()好一些

end

=====================================================================

18年5月26日更新:

在設置字段的時候,可以給字段設置為 not null ,因為 not null 這個概念和默認值是不沖突的。我們在設置默認值為”的時候,雖然避免了null的情況,但是可能存在直接給字段賦值為null,這樣數據庫中還是會出現null的情況,所以強烈建議都給字段加上 not null。

就這樣的:

alter table 數據表 modify `字段名` VARCHAR (255) NOT NULL DEFAULT '';

=======================================================================

18年8月8日更新

既然上面都說了varchar字段的默認值最好不要為null,那么我們平時建表的時候改怎么寫呢?特別是在phpmyadmin中:

1、如果字段是int類型,默認為0

2、如果是varchar類型,默認值留空就好。就是定義,然后留空,直接空格就可以。這個時候我們查看數據表的結構,就會發現該字段是有默認值的。

總結

以上是生活随笔為你收集整理的mysql char null_关于mysql设置varchar 字段的默认值''和null的区别,以及varchar和char的区别...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。