MYSQL中CHAR,VARCHAR,BLOB和TEXT的比較

原文地址:http://blog.163.com/lijianwei_123/blog/static/1848928912011530113629775/


1、 VARCHAR,BLOB和TEXT類型是變長類型,對於其存儲需求取決於列值的實際長度(在前面的表格中用L表示),而不是取決於類型的最大可能尺寸。例如,一個VARCHAR(10)列能保存最大長度爲10個字符的一個字符串,實際的存儲需要是字符串的長度 ,加上1個字節以記錄字符串的長度。對於字符串'abcd',L是4而存儲要求是5個字節。    BLOB和TEXT類型需要1,2,3或4個字節來記錄列值的長度,這取決於類型的最大可能長度。VARCHAR需要定義大小,有255的最大限制;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。

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

  1. 經常變化的字段用varchar
  2. 知道固定長度的用char
  3. 儘量用varchar
  4. 超過255字節的只能用varchar或者text
  5. 能用varchar的地方不用text


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