儲存不區分大小寫的字符數據mysql
TINYTEXT 最大長度是 255 (2^8 – 1) 個字符。sql
TEXT 最大長度是 65535 (2^16 – 1) 個字符。數據庫
MEDIUMTEXT 最大長度是 16777215 (2^24 – 1) 個字符。服務器
LONGTEXT 最大長度是 4294967295 (2^32 – 1) 個字符函數
Var
char 對每一個英文(ASCII)字符都佔用2個字節,對一個漢字也只佔用兩個字節
char 對英文(ASCII)字符佔用1個字節,對一個漢字佔用2個字節
Varchar 的類型不以空格填滿,好比varchar(100),但它的值只是」n」,則它的值就是」n」
而char 不同,好比char(100),它的值是」n」,而實際上它在數據庫中是」n 「(n後共有99個空格,就是把它填滿爲100個字節)。
因爲 char是以固定長度的,因此它的速度會比varchar快得多!但程序處理起來要麻煩一點,要用trim之類的函數把兩邊的空格去掉!
他們的存儲方式和數據的檢索方式都不同。性能
數據的檢索效率是:char>varchar>text測試
空間佔用方面,要具體狀況具體分析了。spa
CHAR(M) |
M個字節,0 <=M<= 255 |
VARCHAR(M) |
L+1個字節,其中L<=M且0 <=M<= 65535 |
TEXT |
L+2個字節,其中L< 216 |
Char爲定長,varchar,text爲變長server
Char在保存的時候,後面(右邊)會用空格填充到指定的長度,在檢索的時候後面的空格會去掉,因此檢索出來的數據須要再用什麼trim之類的函數去處理。(與sql server可能有些不一樣)索引
Varchar在保存的時候,不進行填充。當值保存和檢索時尾部的空格仍保留。
TEXT列不能有默認值,存儲或檢索過程當中,不存在大小寫轉換.
當存儲的字符超過他們定義的長度時候,若是不是在sql服務器的嚴格模式下,都會自動截取合適的字段存儲,而不會出現錯誤。可是,若是是中文的話一樣要報錯誤:)好比定義char(4),而後insert (‘c哈哈’).
注意一點的,Char,Varchar不像數值類型,有系統默認長度,因此必須在括號裏定義長度,能夠有默認值
text不能夠寫默認值,後面若是指定長度,不會報錯誤,可是這個長度是不起做用的,意思就是你插入數據的時候,超過你指定的長度仍是能夠正常插入(嚴格模式下沒有測試 :))
存儲計算:
在使用UTF8字符集的時候,手冊上是這樣描敘的:
· 基本拉丁字母、數字和標點符號使用一個字節。
· 大多數的歐洲和中東手寫字母適合兩個字節序列:擴展的拉丁字母(包括髮音符號、長音符號、重音符號、低音符號和其它音符)、西裏爾字母、希臘語、亞美尼亞語、希伯來語、阿拉伯語、敘利亞語和其它語言。
· 韓語、中文和日本象形文字使用三個字節序列。
char會形成空間浪費,可是有速度優點;而varchar節省了空間,可是速度就不如char。
- 常常變化的字段用varchar
- 知道固定長度的用char
- 儘可能用varchar
- 超過255字節的只能用varchar或者text
- 能用varchar的地方不用text
建表時IP字段設成了varchar,可是因爲要對其建索引,以達到與其它表結合查詢時提升效率的目的,打算將它改爲char,修改後居然沒有成功。
最後發現原來要改就必須把該表中的全部varchar和text的字段一次性都改成char:
alter table ip_table modify ipddress char(16) default 」,modify status char(10) default 」,modify memo char(255) default 」;
又試了下,若是原表中都是char,只要把其中一個字段改成varchar或者text,則其它全部char字段自動改成varchar
……
alter table ip_table modify memo text;
以後表中的狀況:
ipddress varchar(16)
status varchar(10)
memo text
mysql也太扯了……
在同一個表中不能混用CHAR 和VA R C H A R。MySQL 根據狀況甚至會將列從一種類型轉換爲另外一種類型。這樣作的緣由以下:
■ 行定長的表比行可變長的表容易處理(其理由請參閱2 . 3節「選擇列的類型」)。
■ 錶行只在表中全部行爲定長類型時是定長的。即便表中只有一列是可變長的,該表的
行也是可變長的。
■ 由於在行可變長時定長行的性能優勢徹底失去。因此爲了節省存儲空間,在這種狀況
下最好也將定長列轉換爲可變長列。
這表示,若是表中有VARCHAR 列,那麼表中不可能同時有CHAR 列;MySQL 會自動
地將它們轉換爲VARCHAR 列。例如建立以下一個表:
CREATE TABLE my_table
(
c1 CHAR(10),
c2 VARCHAR(10)
)
若是使用DESCRIBE my_table 查詢,則其輸出以下:
Feild Type Null Key Default Extra
c1 varchar(10) yes null
c2 varchar(10) yes null
請注意,VARCHAR 列的出現使MySQL 將c1 也轉換成了VARCHAR 類型。若是試圖用
A LTER TABLE 將c1 轉換爲C H A R,將不起做用。將VARCHAR 列轉換爲CHAR 的唯一辦
法是同時轉換表中全部VARCHAR 列:
ALTER TABLE my_table MODIFY c1 CHAR(10),MODIFY c2 CHAR(10)