varchar 和 char 是兩種最主要的字元串類型 。不幸的是,很難精确地解釋這些值是怎麼 存儲在磁盤和記憶體中的,因為這眼存儲引擎的具體實作有關 。下面的描述假設使用的存 儲引擎是 innodb 和 /或者my isam。如果使用的不是這兩種存儲引擎 ,請參考所使用 的存儲引擎的文檔。
先看看 varc har 和 c ha r 值通常在磁盤上怎麼存儲 。請注意,存儲引擎存儲 cha r 或者 varc har 值的方式在 記憶體中和在磁盤上可能不一樣 ,是以mysql 伺服器從存儲引擎讀 出的值可能需要轉換為另一種存儲格式。下面是關于兩種類型的一些比較。
varchar類型用于存儲可變長字元串,是最常見的字元串資料類型。它比定長類型
更節省空間,因為它僅使用必要的空間(例如,越短的字元串使用越少的空間)。有一種情況例外,如果mysql表使用row_format=fixed建立的話,每一行都會使用定長存儲,這會很浪費空間。
varchar需要使用1或2個額外位元組記錄字元串的長度:如果列的最大長度小于或等于255位元組,則隻使用1個位元組表示,否則使用2個位元組。假設采用latinl字元集 ,一個varc陸r(10)的列需要11個位元組的存儲空間。varc陸r(1000)的列則需要1002個位元組,因為需要2個位元組存儲長度資訊。
varchar節省了存儲空間,是以對性能也有幫助。但是,由于行是變長的,在update時可能使行變得比原來更長,這就導緻需要做額外的工作。如果一個行占用 的空間增長,并且在頁内沒有更多的空間可以存儲,在這種情況下,不同的存儲引擎的處理方式是不一樣的。例如,myisam會将行拆成不同的片段存儲,innodb 則需要分裂頁來使行可以放進頁内。其他一些存儲引擎也許從不在原資料位置更新資料。
下面這些情況下使用varchar是合适的:字元串列的最大長度比平均長度大很多$列的更新很少,是以碎片不是問題p使用了像utf-8這樣複雜的字元集,每個字元 都使用不同的位元組數進行存儲。
在5.0或者更高版本,mysql在存儲和檢索時會保留末尾空格。但在4.1或更老的版本,mysql會剔除末尾空格。
innodb則更靈活,它可以把過長的varc陸r存儲為blob,我們稍後讨論這個問題。
char
char類型是定長的:mysql總是根據定義的字元串長度配置設定足夠的空間。當存char值時,mysql會删除所有的末尾空格(在mysql4.1和更老版本中varcha也是這樣實作的一一也就是說這些版本中char和varchar在邏輯上是一樣的,别隻是在存儲格式上)。c陸r值會根據需要采用空格進行填充以友善比較。
char适合存儲很短的字元串,或者所有值都接近同一個長度。例如,char非常适合存儲密碼的問05值,因為這是一個定長的值。對于經常變更的資料,char也比varchar更好,因為定長的char類型不容易産生碎片。對于非常短的列,charvarchar在存儲空間上也更有效率。例如用char(l)來存儲隻有y和n的值,如采用單位元組字元集注5隻需要一個位元組,但是varc陸r(l)卻需要兩個位元組,因為還一個記錄長度的額外位元組。
char 類型的這些行為可能有一點難以了解,下面通過一個具體的例子來說明。首先,我 們建立一張隻有一個 c陽剛10) 字段的表井且往裡面插入一些值 :

當檢索這些值的時候,會發現 string3 末尾的空格被截斷了。
如果用 varchar(10) 字段存儲相同的值,可以得到如下結果:
資料如何存儲取決于存儲引擎 ,并非所有的存儲引擎都會按照相同的方式處理定長和 變長的字元串 。memory 引擎隻支援定長的行 ,即使有變長字段也會根據最大長度分
配最大空間。不過,填充和截取空格的行為在不同存儲引擎都是一樣的 ,因為這是在mysql 伺服器層進行處理的 。
與 char 和 varchar 類似的類型還有 binary 和 varbinary ,它們存儲的是二進制字元串 。 二進制字元串眼正常字元串非常相似 ,但是二進制字元南存儲的是位元組碼而不是字元 。 填充也不一樣 :mysql 填充 binary 采用的是\0 ( 零位元組) 而不是空格 ,在檢索時也不 會去掉填充值劇。
當需要存儲二進制資料 ,井且希望 mysql 使用位元組碼而不是字元進行比較時 ,這些 類型是非常有用的 。二進制比較的優勢并不僅僅展現在大小寫敏感上 。mysql 比較 binary 字元串時 ,每次按一個位元組 ,并且根據該位元組的數值進行比較 。是以,二進制比 較比字元比較簡單很多 ,是以也就更快。
特别說明:尊重作者的勞動成果,轉載請注明出處哦~~~http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt337