淺談MySQL中char和varchar

淺談MySQL中char和varchar

北大青鳥(niǎo)長(zhǎng)沙麓谷校區(qū)      2022-04-05 13:00:01     3

淺談MySQL中char和varchar,在MYSQL中,char是指:使用指定長(zhǎng)度的固定長(zhǎng)度表示字符串的一種字段類型;比如char(8),則數(shù)據(jù)庫(kù)會(huì)使用固定的1個(gè)字節(jié)(八位)來(lái)

課程價(jià)格 請(qǐng)咨詢

上課時(shí)段: 授課校區(qū):

詳細(xì)介紹

在MYSQL中,char是指:使用指定長(zhǎng)度的固定長(zhǎng)度表示字符串的一種字段類型;比如char(8),則數(shù)據(jù)庫(kù)會(huì)使用固定的1個(gè)字節(jié)(八位)來(lái)存儲(chǔ)數(shù)據(jù),不足8位的字符串在其后補(bǔ)空字符。varchar(M)是一種比char更加靈活的數(shù)據(jù)類型,同樣用于表示字符數(shù)據(jù),但是varchar可以保存可變長(zhǎng)度的字符串。本文我們就來(lái)介紹MySQL中char和varchar。

char:定長(zhǎng),效率高,一般用于固定長(zhǎng)度的表單提交數(shù)據(jù)存儲(chǔ);例如:身份證號(hào),手機(jī)號(hào),電話,密碼等。

varchar:不定長(zhǎng),效率偏低。

1、CHAr(M), VARCHAr(M)不同之處

CHAr(M)定義的列的長(zhǎng)度為固定的,M取值可以為0~255之間,當(dāng)保存CHAR值時(shí),在它們的右邊填充空格以達(dá)到指定的長(zhǎng)度。當(dāng)檢 索到CHAR值時(shí),尾部的空格被刪除掉。在存儲(chǔ)或檢索過(guò)程中不進(jìn)行大小寫轉(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類型的實(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模式禁用值的插入。

2、VARCHAR和TEXT、BlOB類型的區(qū)別

VARCHAR,BLOB和TEXT類型是變長(zhǎng)類型,對(duì)于其存儲(chǔ)需求取決于列值的實(shí)際長(zhǎng)度(在前面的表格中用L表示),而不是取決于類型 的最大可能尺寸。例如,一個(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類型需要1,2,3或4個(gè)字節(jié)來(lái)記錄列值的長(zhǎng)度,這取決于類型的最大可能長(zhǎng)度。VARCHAR需要定義大小,有65535字節(jié)的最大限制;TEXT則不需要。如果你把一個(gè)超過(guò)列類型最大長(zhǎng)度的值賦給一個(gè)BLOB或TEXT列,值被截?cái)嘁赃m合它。

一個(gè)BLOB是一個(gè)能保存可變數(shù)量的數(shù)據(jù)的二進(jìn)制的大對(duì)象。4個(gè)BLOB類型TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB僅僅在他們能保存值的最大長(zhǎng)度方面有所不同。

BLOB 可以儲(chǔ)存圖片,TEXT不行,TEXT只能儲(chǔ)存純文本文件。4個(gè)TEXT類型TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT對(duì)應(yīng)于 4個(gè)BLOB類型,并且有同樣的最大長(zhǎng)度和存儲(chǔ)需求。在BLOB和TEXT類型之間的唯一差別是對(duì)BLOB值的排序和比較以大小寫敏感方式執(zhí)行,而對(duì) TEXT值是大小寫不敏感的。換句話說(shuō),一個(gè)TEXT是一個(gè)大小寫不敏感的BLOB。

3、char,varchar和text的區(qū)別

長(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í)蛴昧?。如果遇到了大文本,考慮使用text,最大能到4G。

效率來(lái)說(shuō)基本是char>varchar>text,但是如果使用的是Innodb引擎的話,推薦使用varchar代替char。

char和varchar可以有默認(rèn)值,text不能指定默認(rèn)值。

數(shù)據(jù)庫(kù)選擇合適的數(shù)據(jù)類型存儲(chǔ)還是很有必要的,對(duì)性能有一定影響。對(duì)于int類型的,如果不需要存取負(fù)值,最好加上unsigned;對(duì)于經(jīng)常出現(xiàn)在where語(yǔ)句中的字段,考慮加索引,整形的尤其適合加索引。

以上就是對(duì)MySQL中的char和varchar的簡(jiǎn)單介紹,關(guān)于char和varchar的更加復(fù)雜的用法和性質(zhì)可以在本站的MySQL教程中找到答案,我們可以由淺入深,深入學(xué)習(xí)MySQL中char和varchar的用法。

培訓(xùn)啦提醒您:交易時(shí)請(qǐng)核實(shí)對(duì)方資質(zhì),對(duì)于過(guò)大宣傳或承諾需謹(jǐn)慎!任何要求預(yù)付定金、匯款等方式均存在風(fēng)險(xiǎn),謹(jǐn)防上當(dāng)。