mysql中的varchar到底能存多長(zhǎng)的字符 1.varchar類(lèi)型的變化 MySQL 數(shù)據(jù)庫(kù)的varchar類(lèi)型在4.1以下的版本中的最大長(zhǎng)度限制為255,其數(shù)據(jù)范圍可以是0~255或1~255(根據(jù)不同版本數(shù)據(jù)庫(kù)來(lái)定)。在 MySQL5.0以上的版本中,varchar數(shù)據(jù)類(lèi)型的長(zhǎng)度支持到了65535,也就
mysql中的varchar到底能存多長(zhǎng)的字符MySQL 數(shù)據(jù)庫(kù)的varchar類(lèi)型在4.1以下的版本中的最大長(zhǎng)度限制為255,其數(shù)據(jù)范圍可以是0~255或1~255(根據(jù)不同版本數(shù)據(jù)庫(kù)來(lái)定)。在 MySQL5.0以上的版本中,varchar數(shù)據(jù)類(lèi)型的長(zhǎng)度支持到了65535,也就是說(shuō)可以存放65532個(gè)字節(jié)的數(shù)據(jù),起始位和結(jié)束位占去了3個(gè)字 節(jié),也就是說(shuō),在4.1或以下版本中需要使用固定的TEXT或BLOB格式存放的數(shù)據(jù)可以使用可變長(zhǎng)的varchar來(lái)存放,這樣就能有效的減少數(shù)據(jù)庫(kù)文 件的大小。
MySQL 數(shù)據(jù)庫(kù)的varchar類(lèi)型在4.1以下的版本中,nvarchar(存儲(chǔ)的是Unicode數(shù)據(jù)類(lèi)型的字符)不管是一個(gè)字符還是一個(gè)漢字,都存為2個(gè)字節(jié) ,一般用作中文或者其他語(yǔ)言輸入,這樣不容易亂碼 ;varchar: 漢字是2個(gè)字節(jié),其他字符存為1個(gè)字節(jié) ,varchar適合輸入英文和數(shù)字。
4.0版本以下,varchar(20),指的是20字節(jié),如果存放UTF8漢字時(shí),只能存6個(gè)(每個(gè)漢字3字節(jié)) ;5.0版本以上,varchar(20),指的是20字符,無(wú)論存放的是數(shù)字、字母還是UTF8漢字(每個(gè)漢字3字節(jié)),都可以存放20個(gè),最大大小是65532字節(jié) ;varchar(20)在Mysql4中最大也不過(guò)是20個(gè)字節(jié),但是Mysql5根據(jù)編碼不同,存儲(chǔ)大小也不同,具體有以下規(guī)則:
a) 存儲(chǔ)限制
varchar 字段是將實(shí)際內(nèi)容單獨(dú)存儲(chǔ)在聚簇索引之外,內(nèi)容開(kāi)頭用1到2個(gè)字節(jié)表示實(shí)際長(zhǎng)度(長(zhǎng)度超過(guò)255時(shí)需要2個(gè)字節(jié)),因此最大長(zhǎng)度不能超過(guò)65535。
b) 編碼長(zhǎng)度限制
字符類(lèi)型若為gbk,每個(gè)字符最多占2個(gè)字節(jié),最大長(zhǎng)度不能超過(guò)32766;
字符類(lèi)型若為utf8,每個(gè)字符最多占3個(gè)字節(jié),最大長(zhǎng)度不能超過(guò)21845。
若定義的時(shí)候超過(guò)上述限制,則varchar字段會(huì)被強(qiáng)行轉(zhuǎn)為text類(lèi)型,并產(chǎn)生warning。
c) 行長(zhǎng)度限制
導(dǎo)致實(shí)際應(yīng)用中varchar長(zhǎng)度限制的是一個(gè)行定義的長(zhǎng)度。 MySQL要求一個(gè)行的定義長(zhǎng)度不能超過(guò)65535。若定義的表長(zhǎng)度超過(guò)這個(gè)值,則提示
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。
CHAR(M)定義的列的長(zhǎng)度為固定的,M取值可以為0~255之間,當(dāng)保存CHAR值時(shí),在它們的右邊填充空格以達(dá)到指定的長(zhǎng)度。當(dāng)檢索到CHAR值時(shí),尾部的空格被刪除掉。在存儲(chǔ)或檢索過(guò)程中不進(jìn)行大小寫(xiě)轉(zhuǎn)換。CHAR存儲(chǔ)定長(zhǎng)數(shù)據(jù)很方便,CHAR字段上的索引效率級(jí)高,比如定義char(10),那么不論你存儲(chǔ)的數(shù)據(jù)是否達(dá)到了10個(gè)字節(jié),都要占去10個(gè)字節(jié)的空間,不足的自動(dòng)用空格填充。
VARCHAR(M)定義的列的長(zhǎng)度為可變長(zhǎng)字符串,M取值可以為0~65535之間,(VARCHAR的最大有效長(zhǎng)度由最大行大小和使用的字符集確定。整體最大長(zhǎng)度是65,532字節(jié))。VARCHAR值保存時(shí)只保存需要的字符數(shù),另加一個(gè)字節(jié)來(lái)記錄長(zhǎng)度(如果列聲明的長(zhǎng)度超過(guò)255,則使用兩個(gè)字節(jié))。VARCHAR值保存時(shí)不進(jìn)行填充。當(dāng)值保存和檢索時(shí)尾部的空格仍保留,符合標(biāo)準(zhǔn)SQL。varchar存儲(chǔ)變長(zhǎng)數(shù)據(jù),但存儲(chǔ)效率沒(méi)有CHAR高。如果一個(gè)字段可能的值是不固定長(zhǎng)度的,我們只知道它不可能超過(guò)10個(gè)字符,把它定義為 VARCHAR(10)是最合算的。VARCHAR類(lèi)型的實(shí)際長(zhǎng)度是它的值的實(shí)際長(zhǎng)度+1。為什么"+1"呢?這一個(gè)字節(jié)用于保存實(shí)際使用了多大的長(zhǎng)度。從空間上考慮,用varchar合適;從效率上考慮,用char合適,關(guān)鍵是根據(jù)實(shí)際情況找到權(quán)衡點(diǎn)。
CHAR和VARCHAR最大的不同就是一個(gè)是固定長(zhǎng)度,一個(gè)是可變長(zhǎng)度。由于是可變長(zhǎng)度,因此實(shí)際存儲(chǔ)的時(shí)候是實(shí)際字符串再加上一個(gè)記錄字符串長(zhǎng)度的字節(jié)(如果超過(guò)255則需要兩個(gè)字節(jié))。如果分配給CHAR或VARCHAR列的值超過(guò)列的最大長(zhǎng)度,則對(duì)值進(jìn)行裁剪以使其適合。如果被裁掉的字符不是空格,則會(huì)產(chǎn)生一條警告。如果裁剪非空格字符,則會(huì)造成錯(cuò)誤(而不是警告)并通過(guò)使用嚴(yán)格SQL模式禁用值的插入。
VARCHAR,BLOB和TEXT類(lèi)型是變長(zhǎng)類(lèi)型,對(duì)于其存儲(chǔ)需求取決于列值的實(shí)際長(zhǎng)度(在前面的表格中用L表示),而不是取決于類(lèi)型的最大可能尺寸。例如,一個(gè)VARCHAR(10)列能保存最大長(zhǎng)度為10個(gè)字符的一個(gè)字符串,實(shí)際的存儲(chǔ)需要是字符串的長(zhǎng)度 ,加上1個(gè)字節(jié)以記錄字符串的長(zhǎng)度。對(duì)于字符串'abcd',L是4而存儲(chǔ)要求是5個(gè)字節(jié)。
BLOB和TEXT類(lèi)型需要1,2,3或4個(gè)字節(jié)來(lái)記錄列值的長(zhǎng)度,這取決于類(lèi)型的最大可能長(zhǎng)度。VARCHAR需要定義大小,有65535字節(jié)的最大限制;TEXT則不需要。如果你把一個(gè)超過(guò)列類(lèi)型最大長(zhǎng)度的值賦給一個(gè)BLOB或TEXT列,值被截?cái)嘁赃m合它。
一個(gè)BLOB是一個(gè)能保存可變數(shù)量的數(shù)據(jù)的二進(jìn)制的大對(duì)象。4個(gè)BLOB類(lèi)型TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB僅僅在他們能保存值的最大長(zhǎng)度方面有所不同。
BLOB 可以?xún)?chǔ)存圖片,TEXT不行,TEXT只能儲(chǔ)存純文本文件。4個(gè)TEXT類(lèi)型TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT對(duì)應(yīng)于4個(gè)BLOB類(lèi)型,并且有同樣的最大長(zhǎng)度和存儲(chǔ)需求。在BLOB和TEXT類(lèi)型之間的唯一差別是對(duì)BLOB值的排序和比較以大小寫(xiě)敏感方式執(zhí)行,而對(duì)TEXT值是大小寫(xiě)不敏感的。換句話(huà)說(shuō),一個(gè)TEXT是一個(gè)大小寫(xiě)不敏感的BLOB。
長(zhǎng)度的區(qū)別,char范圍是0~255,varchar最長(zhǎng)是64k,但是注意這里的64k是整個(gè)row的長(zhǎng)度,要考慮到其它的column,還有如果存在not null的時(shí)候也會(huì)占用一位,對(duì)不同的字符集,有效長(zhǎng)度還不一樣,比如utf8的,最多21845,還要除去別的column,但是varchar在一般情況下存儲(chǔ)都?jí)蛴昧恕H绻龅搅舜笪谋荆紤]使用text,最大能到4G。
效率來(lái)說(shuō)基本是char>varchar>text,但是如果使用的是Innodb引擎的話(huà),推薦使用varchar代替char
char和varchar可以有默認(rèn)值,text不能指定默認(rèn)值
數(shù)據(jù)庫(kù)選擇合適的數(shù)據(jù)類(lèi)型存儲(chǔ)還是很有必要的,對(duì)性能有一定影響。這里在零碎記錄兩筆,對(duì)于int類(lèi)型的,如果不需要存取負(fù)值,最好加上unsigned;對(duì)于經(jīng)常出現(xiàn)在where語(yǔ)句中的字段,考慮加索引,整形的尤其適合加索引。
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com