它們的存儲(chǔ)方式和數(shù)據(jù)的檢索方式都不一樣。
數(shù)據(jù)的檢索效率是:char > varchar > text
空間占用方面宛乃,就要具體情況具體分析了悠咱。
1.char:存儲(chǔ)定長(zhǎng)數(shù)據(jù)很方便蒸辆,CHAR字段上的索引效率級(jí)高,必須在括號(hào)里定義長(zhǎng)度析既,可以有默認(rèn)值吁朦,比如定義char(10),那么不論你存儲(chǔ)的數(shù)據(jù)是否達(dá)到了10個(gè)字符渡贾,都要占去10個(gè)字符的空間(自動(dòng)用空格填充)逗宜,且在檢索的時(shí)候后面的空格會(huì)隱藏掉,所以檢索出來的數(shù)據(jù)需要記得用什么trim之類的函數(shù)去過濾空格空骚。
2.varchar:存儲(chǔ)變長(zhǎng)數(shù)據(jù)纺讲,但存儲(chǔ)效率沒有CHAR高,必須在括號(hào)里定義長(zhǎng)度囤屹,可以有默認(rèn)值熬甚。保存數(shù)據(jù)的時(shí)候,不進(jìn)行空格自動(dòng)填充肋坚,而且如果數(shù)據(jù)存在空格時(shí)乡括,當(dāng)值保存和檢索時(shí)尾部的空格仍會(huì)保留。另外智厌,varchar類型的實(shí)際長(zhǎng)度是它的值的實(shí)際長(zhǎng)度+1诲泌,這一個(gè)字節(jié)用于保存實(shí)際使用了多大的長(zhǎng)度。
3.text:存儲(chǔ)可變長(zhǎng)度的非Unicode數(shù)據(jù)铣鹏,最大長(zhǎng)度為2^31-1個(gè)字符敷扫。text列不能有默認(rèn)值,存儲(chǔ)或檢索過程中诚卸,不存在大小寫轉(zhuǎn)換葵第,后面如果指定長(zhǎng)度,不會(huì)報(bào)錯(cuò)誤合溺,但是這個(gè)長(zhǎng)度是不起作用的卒密,意思就是你插入數(shù)據(jù)的時(shí)候,超過你指定的長(zhǎng)度還是可以正常插入棠赛。
關(guān)于存儲(chǔ)空間:
在使用UTF8字符集的時(shí)候哮奇,手冊(cè)上是這樣描敘的:
基本拉丁字母、數(shù)字和標(biāo)點(diǎn)符號(hào)使用一個(gè)字節(jié)恭朗;
大多數(shù)的歐洲和中東手寫字母適合兩個(gè)字節(jié)序列:擴(kuò)展的拉丁字母(包括發(fā)音符號(hào)屏镊、長(zhǎng)音符號(hào)、重音符號(hào)痰腮、低音符號(hào)和其它音符)而芥、西里爾字母、希臘語(yǔ)膀值、亞美尼亞語(yǔ)棍丐、希伯來語(yǔ)误辑、阿拉伯語(yǔ)、敘利亞語(yǔ)和其它語(yǔ)言歌逢;
韓語(yǔ)巾钉、中文和日本象形文字使用三個(gè)字節(jié)序列。
結(jié)論:
- 經(jīng)常變化的字段用varchar秘案;
- 知道固定長(zhǎng)度的用char砰苍;
- 盡量用varchar;
- 超過255字節(jié)的只能用varchar或者text阱高;
- 能用varchar的地方不用text赚导;
- 能夠用數(shù)字類型的字段盡量選擇數(shù)字類型而不用字符串類型的(電話號(hào)碼),這會(huì)降低查詢和連接的性能赤惊,并會(huì)增加存儲(chǔ)開銷吼旧。這是因?yàn)橐嬖谔幚聿樵兒瓦B接回逐個(gè)比較字符串中每一個(gè)字符,而對(duì)于數(shù)字型而言只需要比較一次就夠了未舟。