溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

mysql 數(shù)據(jù)類型

發(fā)布時(shí)間:2020-08-13 20:11:44 來源:ITPUB博客 閱讀:201 作者:風(fēng)陵渡口_ 欄目:MySQL數(shù)據(jù)庫


一、char的長(zhǎng)度是固定的,不管存儲(chǔ)的數(shù)據(jù)是多少都會(huì)是固定的長(zhǎng)度,上限為255個(gè)字節(jié),varchar的上限為65535字節(jié),
char(4); //這個(gè)4表示最多存儲(chǔ)4個(gè)【字符】, 
長(zhǎng)度可以為從0到255的任何值,當(dāng)存儲(chǔ)的字符串長(zhǎng)度小于指定的長(zhǎng)度, 
會(huì)在字符串的右邊填充空格達(dá)到指定的長(zhǎng)度,當(dāng)查詢字符串的時(shí)候會(huì)刪除右邊空格


二、varchar 是變長(zhǎng)的,
varchar(4)//這個(gè)4表示最多存儲(chǔ)4個(gè)【字符】, 
長(zhǎng)度可以指定為0到65535之間的值(VARCHAR的最大有效長(zhǎng)度由最大行大小和使用的字符集確定。整體最大長(zhǎng)度是65,532字節(jié)), 
VARCHAR值保存時(shí)只保存需要的字符數(shù),另加一個(gè)字節(jié)來記錄長(zhǎng)度(如果列聲明的長(zhǎng)度超過255,則使用兩個(gè)字節(jié)) 
varchar(30)最大存儲(chǔ)30個(gè)字符;varchar(5)和(200)存儲(chǔ)hello所占空間一樣,但后者在排序時(shí)會(huì)消耗更多內(nèi)存,因?yàn)閛rder by col采用fixed_length計(jì)算col長(zhǎng)度(memory引擎也一樣)


三、int(20)中20的涵義是指顯示字符的長(zhǎng)度
但要加參數(shù)的,最大為255,比如它是記錄行數(shù)的id,插入10筆資料,它就顯示00000000001 ~~~00000000010,當(dāng)字符的位數(shù)超過11,它也只顯示11位,如果你沒有加那個(gè)讓它未滿11位就前面加0的參數(shù),它不會(huì)在前面加0
20表示最大顯示寬度為20,但仍占4字節(jié)存儲(chǔ),存儲(chǔ)范圍不變;


四、text
text的上限位65535,不能設(shè)定默認(rèn)值
五、總結(jié)char,varchar,text區(qū)別
char,存定長(zhǎng),速度快,存在空間浪費(fèi)的可能,會(huì)處理尾部空格
varchar,存變長(zhǎng),速度慢,不存在空間浪費(fèi),不處理尾部空格,上限65535,但是有存儲(chǔ)長(zhǎng)度實(shí)際65532最大可用
text,存變長(zhǎng)大數(shù)據(jù),速度慢,不存在空間浪費(fèi),不處理尾部空格,上限65535,會(huì)用額外空間存放數(shù)據(jù)長(zhǎng)度,顧可以全部使用65535。


長(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。
效率來說基本是char>varchar>text,但是如果使用的是Innodb引擎的話,推薦使用varchar代替char
char和varchar可以有默認(rèn)值,text不能指定默認(rèn)值
取數(shù)據(jù)的時(shí)候,char類型的要用trim()去掉多余的空格,而varchar是不需要的,盡管如此,char的存取數(shù)度還是要比varchar要快得多,因?yàn)槠溟L(zhǎng)度固定,方便程序的存儲(chǔ)與查找;但是char也為此付出的是空間的代價(jià),因?yàn)槠溟L(zhǎng)度固定,所以難免會(huì)有多余的空格占位符占據(jù)空間,可謂是以空間換取時(shí)間效率,而varchar是以空間效率為首位的。再者,char的存儲(chǔ)方式是,對(duì)英文字符(ASCII)占用1個(gè)字節(jié),對(duì)一個(gè)漢字占用兩個(gè)字節(jié);
而varchar的存儲(chǔ)方式是,對(duì)每個(gè)英文字符占用2個(gè)字節(jié),漢字也占用2個(gè)字節(jié),兩者的存儲(chǔ)數(shù)據(jù)都非unicode的字符數(shù)據(jù)。


空間方面:
從官方文檔中我們可以得知當(dāng)varchar大于某些數(shù)值的時(shí)候,其會(huì)自動(dòng)轉(zhuǎn)換為text,大概規(guī)則如下:
大于varchar(255)變?yōu)?tinytext
大于varchar(500)變?yōu)?text
大于varchar(20000)變?yōu)?mediumtext
所以對(duì)于過大的內(nèi)容使用varchar和text沒有太多區(qū)別。
性能方面:
索引會(huì)是影響性能的最關(guān)鍵因素,而對(duì)于text來說,只能添加前綴索引,并且前綴索引最大只能達(dá)到1000字節(jié)。
而貌似varhcar可以添加全部索引,但是經(jīng)過測(cè)試,其實(shí)也不是。由于會(huì)進(jìn)行內(nèi)部的轉(zhuǎn)換,所以long varchar其實(shí)也只能添加1000字節(jié)的索引,如果超長(zhǎng)了會(huì)自動(dòng)截?cái)唷?br /> 當(dāng)超過255的長(zhǎng)度之后,使用varchar和text沒有本質(zhì)區(qū)別,只需要考慮一下兩個(gè)類型的特性即可。
(4)、mysql為什么這么設(shè)計(jì)
對(duì)大多數(shù)應(yīng)用沒有意義,只是規(guī)定一些工具用來顯示字符的個(gè)數(shù);int(1)和int(20)存儲(chǔ)和計(jì)算均一樣;

參考:http://www.cnblogs.com/billyxp/p/3548540.html












向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI