char和varchar,數據庫設計時需要注意的一點

char 和 varchar 都是 MySql 數據庫中存儲字符串的數據類型,它們也是經常被面試的題目之一。

char類型
char類型用於存儲長度固定的字符串。存儲範圍:0~255個字符。舉個例子:char(10) ,設置了10個字符,最多存儲10個字符;字符串 "abc" 實際存儲長度爲10,包括7個空字符。但是,如果尾部有空字符,不被保留。因此,char的存儲空間計算公式爲:

char的存儲空間 = 存儲的預定空間 + 一個記錄字符串長度的字節。
  • 特點:有可能浪費存儲空間,但存儲效率高;

  • 存儲策略:用空間換時間;浪費點空間,提高存儲效率;

  • 適用範圍:md5加密字段、uid等長度固定的字段,或者存儲的值都接近一個長度的字符串,以便提高存儲效率。

varchar類型
varchar類型用於存儲可變長度字符串。存儲範圍:0~65532個字符。舉個例子:varchar(10),設置了10個字符,最多存儲10個字符;字符串 "abc" 實際存儲長度爲3。如果尾部有空字符,會被保留。varchar對字符串的存儲是這樣的,字符串長度爲255以內時,會保留一個字節存儲字符串長度;字符串長度大於255時,會保留2個字節存儲字符串長度;每次更改時,都需要更改存儲長度,所以存儲效率低;但是,varchar存儲空間小。因此,varchar的存儲空間計算公式爲:

字符串長度小於等於255時,
  • 特點:節約存儲空間,但存儲效率低;
  • 存儲策略:用時間換空間,可以節約存儲空間;
  • 適用範圍:備註等長度變化很大的字段,以便節約存儲空間。

char 和 varchar 對比結果
我們從存儲長度、存儲效率、存儲空間三個方面對比了char和varchar。得出這樣一個結論:char可能存在多餘空間,但存儲效率高;而varchar則比較節約存儲空間,但存儲效率低;char使用空間換時間,而varchar則犧牲時間換空間。總的來說,char和varchar各有各的優缺點,因此在做數據庫設計時,類似於md5加密、uid等固定長度的字符串,可以使用char來存儲,以便獲取更高的存儲效率和查詢性能。寫在最後說了那麼多,我們來做個測試,看一看它們的長度。先解釋一下需要使用的兩個命令:

# 單位是字節,uft8編碼下一個漢字佔用三個字節,gdk編碼下一個漢字佔用兩個字節,字母、數字各佔一個字節;

這裏有一個表,表裏有兩個字段,name的數據類型是char(10),remark的數據類型是varchar(10),執行以下命令,查看一下它們各自的長度。

select name, char_length(name),length(name) , remark, char_length(remark),length(remark) from test_aa;

執行結果如下圖所示:


查詢結果好像和我們想的不一樣,char類型爲何不是固定長度10呢?別急,再來增加一條尾部帶空字符串的數據。

insert into test_aa values('123456789 ','我們 ')

再查詢一次,查詢結果如下圖所示:


char類型的字段,尾部空字符串沒被保留;而varchar類型的字段,尾部空格保留了。其實,在上面我們已經說得很清楚了。char長度不足時會補足空字符,但末尾有空字符串時又不被保留,所以我們看到的查詢結果是沒有算上末尾空字符串的長度的。這就可以解釋,爲什麼我們查詢的char結果不是固定長度,眼見不一定爲實呀。

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