mysql中varchar與text具體區(qū)別

本文主要給大家簡單講講MySQL中varchar與text具體區(qū)別,相關(guān)專業(yè)術(shù)語大家可以上網(wǎng)查查或者找一些相關(guān)書籍補(bǔ)充一下,這里就不涉獵了,我們就直奔主題吧,希望mysql中varchar與text具體區(qū)別這篇文章可以給大家?guī)硪恍?shí)際幫助。

我們提供的服務(wù)有:網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、班瑪ssl等。為1000多家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的班瑪網(wǎng)站制作公司

大小對比
VARCHAR:varchar在mysql中必須滿足最大行寬度限制,也就是 65535(64k)字節(jié),而varchar本身是按字符串個(gè)數(shù)來定義的,在mysql中使用uft-8字符集一個(gè)字符占用三個(gè)字節(jié),所以單表varchar實(shí)際占用最大長度如下.
    1.使用utf-8字符編碼集varchar最大長度是(65535-2)/3=21844個(gè)字符(超過255個(gè)字節(jié)會有2字節(jié)的額外占用空間開銷,所以減2,如果是255以下,則減1)。
    2.使用utf-8mb4字符集,mysql中使用 utf-8mb4 字符集一個(gè)字符占用4個(gè)字節(jié),所以 varchar 最大長度是(65535-2)/4=16383 個(gè)字符(超過255個(gè)字節(jié)會有2字節(jié)的額外占用空間開銷,所以減2,如果是255以下,則減1)。

注意:如果使用utf-8mb4字符集時(shí),有些需要存儲utf-8字符的時(shí)候,還是會只占3字節(jié),所以有時(shí)會比這個(gè)計(jì)算值能存更多個(gè)字符,因?yàn)閡tf-8mb4是utf-8的超集.

TEXT:最大限制也是64k個(gè)字節(jié),但是本質(zhì)是溢出存儲,innodb默認(rèn)只會存放前768字節(jié)在數(shù)據(jù)頁中,而剩余的數(shù)據(jù)則會存儲在溢出段中,雖然也受單表65535最大行寬度限制,但mysql表中每個(gè)BLOB和TEXT列實(shí)際只占其中的5至9個(gè)字節(jié),其他部分將進(jìn)行溢出存儲.所以實(shí)際占用表最大行寬度為9+2字節(jié),外加的是額外開銷,跟表的實(shí)際寬度沒有關(guān)系.
    1.如果使用utf-8字符集,那么單字段占用最大長度也是21844個(gè)字符.
    2.不過單表可以設(shè)置多個(gè)text字段,這就突破了單表最大行寬度65535的限制

注意:如果采用了新的行格式類型Barracuda (梭子魚),該文件格式擁有新的兩種行格式:compressed和dynamic,兩種格式對blob/text字段采用完全溢出的方式,數(shù)據(jù)頁中只存放20字節(jié),其余的都存放在溢出段中.

其他text:

text字段是分長中短類型,不像varchar只有一種,除了上面的text,還有下面三個(gè).

TinyText:最大長度255個(gè)字節(jié),實(shí)際上是個(gè)沒什么意義的類型了.

MEDIUMTEXT:最大長度限制16M個(gè)字節(jié)。和普通text一樣也支持溢出存儲,所以實(shí)際占用表最大行寬度為9+3字節(jié),外加的是額外開銷
LONGTEXT:最大長度限制4G個(gè)字節(jié)。和普通text一樣也支持溢出存儲,所以實(shí)際占用表最大行寬度為9+4字節(jié),外加的是額外開銷

----------------------------------------

示例:

#VARCHAR單表單字段最長不能超過21844
CREATE TABLE test(
    va VARCHAR(21845)
)DEFAULT CHARSET=utf8;
[Err] 1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
#這樣就可以了
CREATE TABLE test(
    va VARCHAR(21844)
)DEFAULT CHARSET=utf8;
受影響的行: 0
時(shí)間: 0.155s
#雖然每個(gè)BLOB和TEXT列 賬戶只占其中的5至9個(gè)字節(jié)。但是還不夠
CREATE TABLE test(
    va VARCHAR(21841),
    tx text
)DEFAULT CHARSET=utf8;
[Err] 1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
#然后9+2就可以了
CREATE TABLE test(
    va VARCHAR(21840),
    tx text
)DEFAULT CHARSET=utf8;
受影響的行: 0
時(shí)間: 0.170s

--------------------------------------------------------

額外占用空間開銷說明:
varchar 小于255byte  1byte overhead
varchar 大于255byte  2byte overhead
tinytext 0-255 1 byte overhead
text 0-65535 byte 2 byte overhead
mediumtext 0-16M  3 byte overhead
longtext 0-4Gb 4byte overhead

注意:

雖然text字段會把超過768字節(jié)的大部分?jǐn)?shù)據(jù)溢出存放到硬盤其他空間,看上去是會更加增加磁盤壓力.但從處理形態(tài)上來講varchar大于768字節(jié)后,實(shí)質(zhì)上存儲和text差別不是太大了.因?yàn)槌L的varchar也是會用到溢出存儲,讀取該行也是要去讀硬盤然后加載到內(nèi)存,基本認(rèn)為是一樣的。

另外從8000byte這個(gè)點(diǎn)說明一下,mysql的innodb data page默認(rèn)一個(gè)數(shù)據(jù)頁是16K,要存兩行數(shù)據(jù),所以對于varcahr, text如果一行數(shù)據(jù)不超過8000byte ,overflow不會存到別的page中。
----------------------------------------

差異點(diǎn):
text字段,MySQL不允許有默認(rèn)值。建立索引必須給出前綴索引長度.
varchar允許有默認(rèn)值,對索引長度沒限制,

注意:

InnoDB引擎單一字段索引的默認(rèn)長度最大為767字節(jié),myisam為1000字節(jié).例如字符編碼是utf8,那么varchar的索引最大長度是256個(gè)字符.超出限制會導(dǎo)致索引創(chuàng)建不成功,轉(zhuǎn)而需要?jiǎng)?chuàng)建前綴索引.設(shè)置innodb_large_prefix=1可以增大限制,允許索引使用動態(tài)壓縮,但是表的row_format必須是compressed或者dynamic.可以使索引列長度大于767bytes,但是總長度不能大于3072 bytes.
----------------------------------------

總結(jié):
根據(jù)存儲的實(shí)現(xiàn):可以考慮用varchar替代text,因?yàn)関archar存儲更彈性,存儲數(shù)據(jù)少的話性能更高
如果需要非空的默認(rèn)值,就必須使用varchar
如果存儲的數(shù)據(jù)大于64K,就必須使用到mediumtext , longtext,因?yàn)関archar已經(jīng)存不下了
如果varchar(255+)之后,和text在存儲機(jī)制是一樣的,性能也相差無幾
需要特別注意varchar(255)不只是255byte ,實(shí)質(zhì)上有可能占用的更多。

mysql中varchar與text具體區(qū)別就先給大家講到這里,對于其它相關(guān)問題大家想要了解的可以持續(xù)關(guān)注我們的行業(yè)資訊。我們的板塊內(nèi)容每天都會捕捉一些行業(yè)新聞及專業(yè)知識分享給大家的。

分享名稱:mysql中varchar與text具體區(qū)別
文章轉(zhuǎn)載:http://www.muchs.cn/article26/pdhgjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊、軟件開發(fā)、動態(tài)網(wǎng)站、網(wǎng)站策劃、企業(yè)網(wǎng)站制作、面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)