前述
varchar和char是兩種最主要的字符串類型。不幸的是,很難精確地解釋這些值是怎么存儲在磁盤和內存中的,因為這跟存儲引擎的具體實現有關。下面的描述假設使用的存儲引擎是innodb和/或者myisam。如果使用的不是這兩種存儲引擎,請參考所使用的存儲引擎的文檔。
先看看varchar和char值通常在磁盤上怎么存儲。請注意,存儲引擎存儲char或者varchar值的方式在內存中和在磁盤上可能不一樣,所以mysql服務器從存儲引擎讀出的值可能需要轉換為另一種存儲格式。
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)卻需要兩個字節,因為還有一個記錄長度的額外字節。
測試
下面通過例子來具體說明char與varchar行為上的不同,首先,我們創建一張只有一個char(10)字段的表,并且往里面插入一些值:
1
2
3
4
5
6
7
8
9
10
|
create table char_test ( char_col char (10) ); insert into char_test values ( 'string1' ). ( ' string2' ). ( 'string3 ' ); |
當我們檢索這些值的時候,會發現string3末尾的空格被截斷了。
1
2
|
select concat( "'" , char_col, "'" ) from char_test; |
如果用varchar(10)字段存儲相同的值,可以得到如下結果:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
create table varchar_test ( varchar_col varchar (10) ); insert into varchar_test values ( 'string1' ). ( ' string2' ). ( 'string3 ' ); select concat( "'" , varchar_col, "'" ) from varchar_test; |
執行結果
varchar(5)與varchar(200)的區別
我們倘若用varchar(5)和varchar(200)來存儲'hello',我們知道這兩者的空間開銷是一樣的。那么我們可以讓varchar的長度始終保持很大嗎?使用更短的列有什么優勢嗎?
事實證明有很大的優勢。更長的列會消耗更多的內存,因為mysql通常會分配固定大小的內存塊來保存內部值。尤其是使用內存臨時表進行排序或操作時會特別糟糕。在利用磁盤臨時表進行排序時也同樣糟糕。
所以最好的策略是只分配真正需要的空間。
總結
當我們為字符串類型的字段選取類型的時候,判斷該選取varchar還是char,我們可以從以下幾個方面來考慮:
- 該字段數據集的平均長度與最大長度是否相差很小,若相差很小優先考慮char類型,反之,考慮varchar類型。
- 若字段存儲的是md5后的哈希值,或一些定長的值,優先選取char類型。
- 若字段經常需要更新,則優先考慮char類型,由于char類型為定長,因此不容易產生碎片。
- 對于字段值存儲很小的信息,如性別等,優先選取char類型,因為varchar類型會占用額外的字節保存字符串長度信息。
總之一句話,當我們能夠選取char類型的時候,或者說空間消耗相對并不是影響因素的重點時,盡量選取char類型,因為在其他方面,char類型都有著或多或少的優勢。而當空間消耗成為了很大的影響因素以后,我們則考慮使用varchar類型。
到此這篇關于mysql中varchar和char類型的區別的文章就介紹到這了,更多相關mysql varchar和char類型內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/weixin_42570248/article/details/89786882