儲存不區分大小寫的字符數據
TINYTEXT 最大長度是 255 (2^8 – 1) 個字符。
TEXT 最大長度是 65535 (2^16 – 1) 個字符。
MEDIUMTEXT 最大長度是 16777215 (2^24 – 1) 個字符。
LONGTEXT 最大長度是 4294967295 (2^32 – 1) 個字符
char 對英文(ASCII)字符占用1個字節,對一個漢字占用2個字節
Varchar 的類型不以空格填滿,比如varchar(100),但它的值只是”n”,則它的值就是”n”
而char 不一樣,比如char(100),它的值是”n”,而實際上它在數據庫中是”n “(n后共有99個空格,就是把它填滿為100個字節)。
由於 char是以固定長度的,所以它的速度會比varchar快得多!但程序處理起來要麻煩一點,要用trim之類的函數把兩邊的空格去掉!
他們的存儲方式和數據的檢索方式都不一樣。
數據的檢索效率是:char>varchar>text
空間占用方面,要具體情況具體分析了。
Char為定長,varchar,text為變長
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
最后發現原來要改就必須把該表中的所有varchar和text的字段一次性都改為char:
alter table ip_table modify ipddress char(16) default ”,modify status char(10) default ”,modify memo char(255) default ”;
……
alter table ip_table modify memo text;
之后表中的情況:
ipddress varchar(16)
status varchar(10)
memo text
■ 行定長的表比行可變長的表容易處理(其理由請參閱2 . 3節“選擇列的類型”)。
■ 表行只在表中所有行為定長類型時是定長的。即使表中只有一列是可變長的,該表的
行也是可變長的。
■ 因為在行可變長時定長行的性能優點完全失去。所以為了節省存儲空間,在這種情況
下最好也將定長列轉換為可變長列。
這表示,如果表中有VARCHAR 列,那么表中不可能同時有CHAR 列;MySQL 會自動
地將它們轉換為VARCHAR 列。例如創建如下一個表:
(
c1 CHAR(10),
c2 VARCHAR(10)
)
c1 varchar(10) yes null
c2 varchar(10) yes null
A LTER TABLE 將c1 轉換為C H A R,將不起作用。將VARCHAR 列轉換為CHAR 的惟一辦
法是同時轉換表中所有VARCHAR 列: