char:定長,效率高,通常用於固定長度的表單提交數據存儲 ;例如:身份證號,手機號,電話,密碼等mysql
varchar:不定長,效率偏低sql
MySQL 數據庫的varchar類型在4.1如下的版本中的最大長度限制爲255,其數據範圍能夠是0~255或1~255(根據不一樣版本數據庫來定)。在 MySQL5.0以上的版本中,varchar數據類型的長度支持到了65535,也就是說能夠存放65532個字節的數據,起始位和結束位佔去了3個字 節,也就是說,在4.1或如下版本中須要使用固定的TEXT或BLOB格式存放的數據可使用可變長的varchar來存放,這樣就能有效的減小數據庫文 件的大小。數據庫
MySQL 數據庫的varchar類型在4.1如下的版本中,nvarchar(存儲的是Unicode數據類型的字符)不論是一個字符仍是一個漢字,都存爲2個字 節 ,通常用做中文或者其餘語言輸入,這樣不容易亂碼 ;varchar: 漢字是2個字節,其餘字符存爲1個字節 ,varchar適合輸入英文和數字。性能
4.0版本如下,varchar(20),指的是20字節,若是存放UTF8漢字時,只能存6個(每一個漢字3字節) ;5.0版本以上,varchar(20),指的是20字符,不管存放的是數字、字母仍是UTF8漢字(每一個漢字3字節),均可以存放20個,最大大小是 65532字節 ;varchar(20)在Mysql4中最大也不過是20個字節,可是Mysql5根據編碼不一樣,存儲大小也不一樣,具體有如下規則:編碼
a) 存儲限制code
varchar 字段是將實際內容單獨存儲在聚簇索引以外,內容開頭用1到2個字節表示實際長度(長度超過255時須要2個字節),所以最大長度不能超過65535。對象
b) 編碼長度限制排序
字符類型若爲gbk,每一個字符最多佔2個字節,最大長度不能超過32766;索引
字符類型若爲utf8,每一個字符最多佔3個字節,最大長度不能超過21845。圖片
若定義的時候超過上述限制,則varchar字段會被強行轉爲text類型,併產生warning。
c) 行長度限制
致使實際應用中varchar長度限制的是一個行定義的長度。 MySQL要求一個行的定義長度不能超過65535。若定義的表長度超過這個值,則提示
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。
CHAR(M)定義的列的長度爲固定的,M取值能夠爲0~255之間,當保存CHAR值時,在它們的右邊填充空格以達到指定的長度。當檢 索到CHAR值時,尾部的空格被刪除掉。在存儲或檢索過程當中不進行大小寫轉換。CHAR存儲定長數據很方便,CHAR字段上的索引效率級高,好比定義 char(10),那麼不論你存儲的數據是否達到了10個字節,都要佔去10個字節的空間,不足的自動用空格填充。
VARCHAR(M)定義的列的長度爲可變長字符串,M取值能夠爲0~65535之間,(VARCHAR的最大有效長度由最大行大小和使用 的字符集肯定。總體最大長度是65,532字節)。VARCHAR值保存時只保存須要的字符數,另加一個字節來記錄長度(若是列聲明的長度超過255,則 使用兩個字節)。VARCHAR值保存時不進行填充。當值保存和檢索時尾部的空格仍保留,符合標準SQL。varchar存儲變長數據,但存儲效率沒有 CHAR高。若是一個字段可能的值是不固定長度的,咱們只知道它不可能超過10個字符,把它定義爲 VARCHAR(10)是最合算的。VARCHAR類型的實際長度是它的值的實際長度+1。爲何」+1″呢?這一個字節用於保存實際使用了多大的長度。 從空間上考慮,用varchar合適;從效率上考慮,用char合適,關鍵是根據實際狀況找到權衡點。
CHAR和VARCHAR最大的不一樣就是一個是固定長度,一個是可變長度。因爲是可變長度,所以實際存儲的時候是實際字符串再加上一個記錄 字符串長度的字節(若是超過255則須要兩個字節)。若是分配給CHAR或VARCHAR列的值超過列的最大長度,則對值進行裁剪以使其適合。若是被裁掉 的字符不是空格,則會產生一條警告。若是裁剪非空格字符,則會形成錯誤(而不是警告)並經過使用嚴格SQL模式禁用值的插入。
VARCHAR,BLOB和TEXT類型是變長類型,對於其存儲需求取決於列值的實際長度(在前面的表格中用L表示),而不是取決於類型 的最大可能尺寸。例如,一個VARCHAR(10)列能保存最大長度爲10個字符的一個字符串,實際的存儲須要是字符串的長度 ,加上1個字節以記錄字符串的長度。對於字符串’abcd’,L是4而存儲要求是5個字節。
BLOB和TEXT類型須要1,2,3或4個字節來記錄列值的長度,這取決於類型的最大可能長度。VARCHAR須要定義大小,有65535字節的最大限制;TEXT則不須要。若是你把一個超過列類型最大長度的值賦給一個BLOB或TEXT列,值被截斷以適合它。
一個BLOB是一個能保存可變數量的數據的二進制的大對象。4個BLOB類型TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB僅僅在他們能保存值的最大長度方面有所不一樣。
BLOB 能夠儲存圖片,TEXT不行,TEXT只能儲存純文本文件。4個TEXT類型TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT對應於 4個BLOB類型,而且有一樣的最大長度和存儲需求。在BLOB和TEXT類型之間的惟一差異是對BLOB值的排序和比較以大小寫敏感方式執行,而對 TEXT值是大小寫不敏感的。換句話說,一個TEXT是一個大小寫不敏感的BLOB。
長度的區別,char範圍是0~255,varchar最長是64k,可是注意這裏的64k是整個row的長度,要考慮到其它的 column,還有若是存在not null的時候也會佔用一位,對不一樣的字符集,有效長度還不同,好比utf8的,最多21845,還要除去別的column,可是varchar在通常 狀況下存儲都夠用了。若是遇到了大文本,考慮使用text,最大能到4G。
效率來講基本是char>varchar>text,可是若是使用的是Innodb引擎的話,推薦使用varchar代替char。
char和varchar能夠有默認值,text不能指定默認值。
數據庫選擇合適的數據類型存儲仍是頗有必要的,對性能有必定影響。這裏在零碎記錄兩筆,對於int類型的,若是不須要存取負值,最好加上unsigned;對於常常出如今where語句中的字段,考慮加索引,整形的尤爲適合加索引。