【刷題】麪筋-MySQL中char、varchar和text三者的區別

概述

在MySQL中,char、varchar和text類型的字段均可以用來存儲字符類型的數據,函數

char、varchar均可以指定最大的字符長度,但text不能夠。
它們的存儲方式和數據的檢索方式也都不同。
數據的檢索效率是:char > varchar > text性能

具體說明:

  • char:

    • 存儲定長數據很方便,CHAR字段上的索引效率級高,必須在括號裏定義長度,能夠有默認值,好比定義char(10),那麼不論你存儲的數據是否達到了10個字節,都要佔去10個字節的空間(自動用空格填充),且在檢索的時候後面的空格會隱藏掉,因此檢索出來的數據須要記得用trim之類的函數去過濾空格。
  • varchar:

    • 存儲變長數據,但存儲效率沒有char高,必須在括號裏定義長度,能夠有默認值。保存數據的時候,不進行空格自動填充,並且若是數據存在空格時,當值保存和檢索時尾部的空格仍會保留。另外,varchar類型的實際長度是它的值的實際長度+1,這一個字節用於保存實際使用了多大的長度。
  • text:

    • 存儲可變長度的非Unicode數據,最大長度爲2^16-1個字符。text列不能有默認值,存儲或檢索過程當中,不存在大小寫轉換,後面若是指定長度,不會報錯誤,可是這個長度是不起做用的,意思就是你插入數據的時候,超過你指定的長度仍是能夠正常插入。

關於存儲空間:

在使用UTF8字符集的時候,MySQL手冊上是這樣描述的:code

  • 基本拉丁字母、數字和標點符號使用一個字節;
  • 大多數的歐洲和中東手寫字母適合兩個字節序列:擴展的拉丁字母(包括髮音符號、長音符號、重音符號、低音符號和其它音符)、西裏爾字母、希臘語、亞美尼亞語、希伯來語、阿拉伯語、敘利亞語和其它語言;
  • 韓語、中文和日本象形文字使用三個字節序列。

結論:

  • 常常變化的字段用varchar;
  • 知道固定長度的用char;
  • 超過255字節的只能用varchar或者text;
  • 能用varchar的地方不用text;
  • 可以用數字類型的字段儘可能選擇數字類型而不用字符串類型,這會下降查詢和鏈接的性能,並會增長存儲開銷。這是由於引擎在處理查詢和鏈接回逐個比較字符串中每個字符,而對於數字型而言只須要比較一次就夠了;
  • 同一張表出現多個大字段,能合併時儘可能合併,不能合併時考慮分表

END

相關文章
相關標籤/搜索