溫馨提示×

溫馨提示×

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

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

Mysql中varchar與char的區(qū)別有哪些

發(fā)布時間:2021-11-06 09:01:23 來源:億速云 閱讀:175 作者:小新 欄目:MySQL數(shù)據(jù)庫

這篇文章給大家分享的是有關(guān)Mysql中varchar與char的區(qū)別有哪些的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

mysql中varchar與char的區(qū)別以及varchar(30)中的30代表的涵義

       (1)varchar與char的區(qū)別

varchar存儲可變長字符串,小于255字節(jié)時需要1個額外字節(jié)(大于255需要2個額外字節(jié))存儲長度,最大長度為65532字節(jié)(所有列總和);

char存儲定長(right padding),讀取時會截?cái)嗄┪部崭?,長度最大為255字符;

char 與varchar都是用來存儲字符串的,只是他們的保存方式不一樣,char有固定的長度,而varchar屬于可變長的字符類型。

char是一種固定長度的類型,varchar則是一種可變長度的類型。

char(M)類型的數(shù)據(jù)列里,每個值都占用M個字節(jié),如果某個長度小于M,MySQL就會在它的右邊用空格字符補(bǔ)足。(在檢索操作中那些填補(bǔ)出來的空格字符將被去掉)在varchar(M)類型的數(shù)據(jù)列里,每個值只占用剛好夠用的字節(jié)再加上一個用來記錄其長度的字節(jié)(即總長度為L+1字節(jié))。

建議:

myisam存儲引擎建議使用固定長度,數(shù)據(jù)列代替可變長度的數(shù)據(jù)列。

memory存儲引擎目前都使用固定數(shù)據(jù)行存儲,因此無論使用char,varchar列都沒有關(guān)系。

Innodb存儲引擎建議使用varchar類型。

在MySQL中用來判斷是否需要進(jìn)行對數(shù)據(jù)列類型轉(zhuǎn)換的規(guī)則:

1. 在一個數(shù)據(jù)表里,如果每一個數(shù)據(jù)列的長度都是固定的,那么每一個數(shù)據(jù)行的長度也將是固定的。

2. 只要數(shù)據(jù)表里有一個數(shù)據(jù)列的長度是可變的,那么各數(shù)據(jù)行的長度都是可變的。

3. 如果某個數(shù)據(jù)表里的數(shù)據(jù)行的長度是可變的,那么為了節(jié)約存儲空間,MySQL會把這個數(shù)據(jù)表里的固定長度類型的數(shù)據(jù)列轉(zhuǎn)換為相應(yīng)的可變長度類型。

     對于MyISAM表,盡量使用char,對于那些經(jīng)常需要修改而容易形成碎片的myisam和isam數(shù)據(jù)表就更是如此,它的缺點(diǎn)就是占用磁盤空間;

     對于InnoDB表,因?yàn)樗臄?shù)據(jù)行內(nèi)部存儲格式對固定長度的數(shù)據(jù)行和可變長度的數(shù)據(jù)行不加區(qū)分(所有數(shù)據(jù)行共用一個表頭部分,這個表頭部分存放著指向各個有關(guān)數(shù)據(jù)列的指針),所以使用char類型不見得會比使用varchar類型好。事實(shí)上,因?yàn)閏har類型通常要比varchar類型占用更多的空間,所以從減少空間占用量和減少磁盤i/o的角度,使用varchar類型反而更有利。

       (2)varchar(30)中30的涵義

     最大存儲30個字符;varchar(5)和(200)存儲hello所占空間一樣,但后者在排序時會消耗更多內(nèi)存,因?yàn)閛rder by col 采用fixed_length計(jì)算col長度(memory)引擎一樣。

     For example, a varchar(255) column can hold a string with a maximum length of 255 characters(字符而非字節(jié)),對于latin1, ‘a(chǎn)bcd’的L為4,存儲需要5個字節(jié);對于ucs2(雙字節(jié)字符),則需要10個字節(jié)存儲(最大長度為510>255,故需要額外2個字節(jié))

       (3)int(20)中20的涵義

     20表示最大顯示寬度為20,但仍占4個字節(jié)存儲,存儲范圍不變;

create table int_test(a int zerofill NOT NULL auto_increment, PRIMARY KEY (a));

create table int_test_4(a int(4) zerofill NOT NULL auto_increment, PRIMARY KEY (a));

select * from int_test;
+------------+
| a          |
+------------+
| 0000000001 |
| 0000000002 |
| 0000000003 |
| 2147483648 |
+------------+

select * from int_test_4;
+------------+
| a          |
+------------+
|       0001 |
|       0002 |
|       0003 |
| 2147483648 |
+------------+

       (4)為什么MySQL這樣設(shè)計(jì)?

    對大多數(shù)應(yīng)用沒有意義,只是規(guī)定一些工具用來顯示字符的個數(shù);int(1)和int(20)存儲和結(jié)算均一樣。

感謝各位的閱讀!關(guān)于“Mysql中varchar與char的區(qū)別有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

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

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

AI