您現在的位置: 365建站網 > 365學習 > mysql建表varchar和char的長度和區別

mysql建表varchar和char的長度和區別

文章來源:365jz.com     點擊數:562    更新時間:2021-03-13 10:35   參與評論

MySQL數據庫的varchar類型在5.0.3以下的版本中的最大長度限制為255,其數據范圍可以是0~255。
在MySQL5.0.3及以上的版本中,varchar數據類型的長度支持到了65535,也就是說可以存放65532個字節的數據,起始位和結束位占去了3個字節,也就是說,在5.0.3以下版本中需要使用固定的TEXT或BLOB格式存放的數據可以在高版本中使用可變長的varchar來存放,這樣就能有效的減少數據庫文件的大小。
如果在varchar中寫入大于設定的長度,默認情況下會截去后面的部分。

VARCHAR類型

VARCHAR類型用于存儲可變長字符串,是最常見的字符串數據類型。它比定長類型更節省空間,因為它僅使用必要的空間(例如,越短的字符串使用越少的空間)。有一種情況例外,如果MySQL表使用ROW_FORMAT=FIXED創建的話,每一行都會使用定長存儲,這會很浪費空間。

VARCHAR需要使用1或2個額外字節記錄字符串的長度:如果列的最大長度小于或等于255字節,則只使用1個字節表示,否則使用2個字節。假設采用latin1字符集,一個VARCHAR(10)的列需要11個字節的存儲空間。VARCHAR(1000)的列則需要1002個字節,因為需要2個字節存儲長度信息。

VARCHAR節省了存儲空間,所以對性能也有幫助。但是,由于行是變長的,在UPDATE時可能使行變得比原來更長,這就導致需要做額外的工作。如果一個行占用的空間增長,并且在頁內沒有更多的空間可以存儲,在這種情況下,不同的存儲引擎的處理方式是不一樣的。例如,MyISAM會將行拆成不同的片段存儲,InnoDB則需要分裂頁來使行可以放進頁內。其他一些存儲引擎也許從不在原數據位置更新數據。

VARCHAR適用情況

下面這些情況下適用VARCHAR是合適的:

字符串列的最大長度比平均長度大很多

列的更新很少,所以碎片不是問題

使用了像UTF-8這樣復雜的字符集,每個字符都使用不同的字節數進行存儲

CHAR類型

CHAR類型是定長的:MySQL總是根據定義的字符串長度分配足夠的空間。當存儲CHAR值時,MySQL會刪除所有的末尾空格。CHAR值會根據需要采用空格進行填充以方便比較。

CHAR適合存儲很短的字符串,或者所有值都接近同一個長度。例如,CHAR非常適合存儲密碼的MD5值,因為這是一個定長的值。對于經常變更的數據,CHAR也比VARCHAR更好,因為定長的CHAR類型不容易產生碎片。對于非常短的列,CHAR比VARCHAR在存儲空間上也更有效率。例如用CHAR(1)來存儲只有Y和N的值,如果采用單字節字符集只需要一個字節,但是VARCHAR(1)卻需要兩個字節,因為還有一個記錄長度的額外字節。

VARCHAR(5)與VARCHAR(200)的區別

我們倘若用VARCHAR(5)和VARCHAR(200)來存儲'hello',我們知道這兩者的空間開銷是一樣的。那么我們可以讓VARCHAR的長度始終保持很大嗎?使用更短的列有什么優勢嗎?

事實證明有很大的優勢。更長的列會消耗更多的內存,因為MySQL通常會分配固定大小的內存塊來保存內部值。尤其是使用內存臨時表進行排序或操作時會特別糟糕。在利用磁盤臨時表進行排序時也同樣糟糕。

image.png

例如在CHAR(4)和VARCHAR(4)中存放不同數據類型,其結果如下表所示:

image.png

所以最好的策略是只分配真正需要的空間。

1、 char長度固定, 即每條數據占用等長字節空間;適合用在身份證號碼、手機號碼等定。
2、 varchar可變長度,可以設置最大長度;適合用在長度可變的屬性。
3、 text不設置長度, 當不知道屬性的最大長度時,適合用text。
按照查詢速度: char最快, varchar次之,text最慢。


總結

1、長度的區別,char范圍是0~255,varchar最長是64k,但是注意這里的64k是整個row的長度,要考慮到其它的 column,還有如果存在not null的時候也會占用一位,對不同的字符集,有效長度還不一樣,比如utf8的,最多21845,還要除去別的column,但是varchar在一般 情況下存儲都夠用了。如果遇到了大文本,考慮使用text,最大能到4G。

2、效率來說基本是char>varchar>text,但是如果使用的是Innodb引擎的話,推薦使用varchar代替char。

3、char和varchar可以有默認值,text不能指定默認值。

4、數據庫選擇合適的數據類型存儲還是很有必要的,對性能有一定影響。這里在零碎記錄兩筆,對于int類型的,如果不需要存取負值,最好加上unsigned;對于經常出現在where語句中的字段,考慮加索引,整形的尤其適合加索引。

當我們為字符串類型的字段選取類型的時候,判斷該選取VARCHAR還是CHAR,我們可以從以下幾個方面來考慮:

該字段數據集的平均長度與最大長度是否相差很小,若相差很小優先考慮CHAR類型,反之,考慮VARCHAR類型。
若字段存儲的是MD5后的哈希值,或一些定長的值,優先選取CHAR類型。
若字段經常需要更新,則優先考慮CHAR類型,由于CHAR類型為定長,因此不容易產生碎片。
對于字段值存儲很小的信息,如性別等,優先選取CHAR類型,因為VARCHAR類型會占用額外的字節保存字符串長度信息

總之一句話,當我們能夠選取CHAR類型的時候,或者說空間消耗相對并不是影響因素的重點時,盡量選取CHAR類型,因為在其他方面,CHAR類型都有著或多或少的優勢。而當空間消耗成為了很大的影響因素以后,我們則考慮使用VARCHAR類型。

如對本文有疑問,請提交到交流論壇,廣大熱心網友會為你解答??! 點擊進入論壇


發表評論 (562人查看,0條評論)
請自覺遵守互聯網相關的政策法規,嚴禁發布色情、暴力、反動的言論。
用戶名: 驗證碼: 點擊我更換圖片
最新評論
------分隔線----------------------------
自拍偷拍福力视频,偷拍国际精品,麻豆一区福利电影,国产网红视频午夜福利,se视频大全,久久国产AV影院 亚洲精品无码久久| 韩国免费a级作爱片无码| 欧美亚洲色偷另类图片欧美| 伊伊综合在线视频无码| 咪咪网| 无码免费无线观看在线视频| 精品国精品国产自在久国产| 韩国理论片| 我把她日出了白浆10| 激情婷婷五月综合基地| 日本大尺度吃奶无遮无挡| 打开腿让老男人玩| 嫩草视频在线观看免费播放| 国内自拍偷国视频系列| a级毛片100部免费观看| 我的绝色美女房客| 国内揄拍国内精品对86| 亚洲jizzjizz在线播放| japanesefreel日本jav| 国产精品制服丝袜无码| aa久久久久免费是国产| 成在线人永久免费视频播放| 从后面糟蹋成功视频| 高h猛烈失禁潮喷a片| 小sao货水好多真紧h视频| 深圳出租屋故事| 国产精品高清视频免费| 成年偏黄全免费网站| 国模私密浓毛私拍人体视频| 久爱www人成免费网站| 人妻在厨房被侮辱电影| http://www.nerdzdesign.com