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結果不是固定長度,眼見不一定爲實呀。