他們的存儲方式和數據的檢索方式都不同。sql
數據的檢索效率是:char>varchar>text服務器
空間佔用方面,要具體狀況具體分析了。函數
CHAR(M) | M個字節,0 <=M<= 255 |
VARCHAR(M) | L+1個字節,其中L<=M且0 <=M<= 65535 |
TEXT | L+2個字節,其中L< 216 |
Char爲定長,varchar,text爲變長測試
Char在保存的時候,後面(右邊)會用空格填充到指定的長度,在檢索的時候後面的空格會去掉,因此檢索出來的數據須要再用什麼trim之類的函數去處理。(與sql server可能有些不一樣)spa
Varchar在保存的時候,不進行填充。當值保存和檢索時尾部的空格仍保留。server
TEXT列不能有默認值,存儲或檢索過程當中,不存在大小寫轉換.get
當存儲的字符超過他們定義的長度時候,若是不是在sql服務器的嚴格模式下,都會自動截取合適的字段存儲,而不會出現錯誤。可是,若是是中文的話一樣要報錯誤:)好比定義char(4),而後insert (‘c哈哈’).io
注意一點的,Char,Varchar不像數值類型,有系統默認長度,因此必須在括號裏定義長度,能夠有默認值table
text不能夠寫默認值,後面若是指定長度,不會報錯誤,可是這個長度是不起做用的,意思就是你插入數據的時候,超過你指定的長度仍是能夠正常插入(嚴格模式下沒有測試:))效率
存儲計算:
在使用UTF8字符集的時候,手冊上是這樣描敘的:
· 基本拉丁字母、數字和標點符號使用一個字節。
· 大多數的歐洲和中東手寫字母適合兩個字節序列:擴展的拉丁字母(包括髮音符號、長音符號、重音符號、低音符號和其它音符)、西裏爾字母、希臘語、亞美尼亞語、希伯來語、阿拉伯語、敘利亞語和其它語言。
· 韓語、中文和日本象形文字使用三個字節序列。
char會形成空間浪費,可是有速度優點;而varchar節省了空間,可是速度就不如char。
常常變化的字段用varchar
知道固定長度的用char
儘可能用varchar
超過255字節的只能用varchar或者text
能用varchar的地方不用text