1. 程式人生 > >mysql中char與varchar的區別分析

mysql中char與varchar的區別分析

以下內容轉載自 :http://www.jb51.net/article/23575.htm

char與varchar的區別


char (20)長度固定, 如'www.jb51.net' 儲存需要空間 20個字元

varchar(20) 可變長 如'www.jb51.net' 需要儲存空間 12+1=13字元,

從上面可以看得出來char 長度是固定的,不管你儲存的資料是多少他都會都固定的長度。而varchar則處可變長度但他要在總長度上加1字元,這個用來儲存位置。所以實際應用中使用者可以根據自己的資料型別來做。

再看看char,與varchar在速度上的區別吧。
複製程式碼 程式碼如下:
mysal>create tabe ab(v varchar(4),c char(4));
query ok ,0 rows affected(0.02 sec)
mysql>insert into abc values('ab ','ab ')
query ok ,1 row affected(0.00 sec);
mysql->select concat(v ,'+') ,concat(c ,'+') form abc
ab + | ab+
1rows in set (0.00 sec)

從上面可以看出來,由於某種原因char 固定長度,所以在處理速度上要比varchar快速很多,但是對費儲存空間,所以對儲存不大,但在速度上有要求的可以使用char型別,反之可以用varchar型別來例項。

註明:

在用char字元型別時內容後面有空間時必須作相關處理,要不就會把空格自動刪除。

建意:

myisam 儲存引擎 建議使用固定長度,資料列代替可變長度的資料列。
memory儲存引擎 目前都使用固定資料行儲存,因此無論使用char varchar列都沒關係,
innodb 儲存引擎 建意使用varchar 型別


以下是其它網友的補充



char是一種固定長度的型別,varchar則是一種可變長度的型別
  char(M)型別的資料列裡,每個值都佔用M個位元組,如果某個長度小於M,MySQL就會在它的右邊用空格字元補足.(在檢索操作中那些填補出來的空格字元將被去掉)在varchar(M)型別的資料列裡,每個值只佔用剛好夠用的位元組再加上一個用來記錄其長度的位元組(即總長度為L+1位元組).

在MySQL中用來判斷是否需要進行對據列型別轉換的規則

  1、在一個數據表裡,如果每一個數據列的長度都是固定的,那麼每一個數據行的長度也將是固定的.
  2、只要資料表裡有一個數據列的長度的可變的,那麼各資料行的長度都是可變的.
  3、如果某個資料表裡的資料行的長度是可變的,那麼,為了節約儲存空間,MySQL會把這個資料表裡的固定長度型別的資料列轉換為相應的可變長度型別.
例外:長度小於4個字元的char資料列不會被轉換為varchar型別

  對於MyISAM表,儘量使用Char,對於那些經常需要修改而容易形成碎片的myisam和isam資料表就更是如此,它的缺點就是佔用磁碟空間


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

文章2:
字元應該是最常見的一種了,但似乎各個資料庫都有所不同,比如oracle中就有啥varchar2之類。不過mysql似乎最多的還是集中在char和varchar上。
說說區別。char是固定長度的,而varchar會根據具體的長度來使用儲存空間。比如char(255)和varchar(255),在儲存字串"hello world"的時候,char會用一塊255的空間放那個11個字元,而varchar就不會用255個,他先計算長度後只用11個再加上計算的到字串長度資訊,一般1-2個byte來,這樣varchar在儲存不確定長度的時候會大大減少儲存空間。

如此看來varchar比char聰明多了,那char有用武之地嗎?還是很不少優勢的。


一,儲存很短的資訊,比如門牌號碼101,201……這樣很短的資訊應該用char,因為varchar還要佔個byte用於儲存資訊長度,本來打算節約儲存的現在得不償失。

二,固定長度的。比如使用uuid作為主鍵,那用char應該更合適。因為他固定長度,varchar動態根據長度的特性就消失了,而且還要佔個長度資訊。

三,十分頻繁改變的column。因為varchar每次儲存都要有額外的計算,得到長度等工作,如果一個非常頻繁改變的,那就要有很多的精力用於計算,而這些對於char來說是不需要的。


還有一個關於varchar的問題是,varchar他既然可以自動適應儲存空間,那我varchar(8)和varchar(255)儲存應該都是一樣的,那每次表設計的時候往大的方向去好了,免得以後不夠用麻煩。這個思路對嗎?答案是否定的。mysql會把表資訊放到記憶體中(查詢第一次後,就快取住了,linux下很明顯,但windows下似乎沒有,不知道為啥),這時記憶體的申請是按照固定長度來的,如果varchar很大就會有問題。所以還是應該按需索取。

總結:仔細看DZ的資料表,定長的欄位基本還都是用char....