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

kakaxi9521發表於2017-03-29

mysqlvarcharchar的區別以及varchar(30)中的30代表的涵義

       (1varcharchar的區別

varchar儲存可變長字串,小於255位元組時需要1個額外位元組(大於255需要2個額外位元組)儲存長度,最大長度為65532位元組(所有列總和);

char儲存定長(right padding,讀取時會截斷末尾空格,長度最大為255字元;

char varchar都是用來儲存字串的,只是他們的儲存方式不一樣,char有固定的長度,而varchar屬於可變長的字元型別。

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

char(M)型別的資料列裡,每個值都佔用M個位元組,如果某個長度小於MMySQL就會在它的右邊用空格字元補足。(在檢索操作中那些填補出來的空格字元將被去掉)在varcharM)型別的資料列裡,每個值只佔用剛好夠用的位元組再加上一個用來記錄其長度的位元組(即總長度為L+1位元組)。

建議:

myisam儲存引擎建議使用固定長度,資料列代替可變長度的資料列。

memory儲存引擎目前都使用固定資料行儲存,因此無論使用charvarchar列都沒有關係。

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

MySQL中用來判斷是否需要進行對資料列型別轉換的規則:

1. 在一個資料表裡,如果每一個資料列的長度都是固定的,那麼每一個資料行的長度也將是固定的。

2. 只要資料表裡有一個資料列的長度是可變的,那麼各資料行的長度都是可變的。

3. 如果某個資料表裡的資料行的長度是可變的,那麼為了節約儲存空間,MySQL會把這個資料表裡的固定長度型別的資料列轉換為相應的可變長度型別。

     對於MyISAM表,儘量使用char,對於那些經常需要修改而容易形成碎片的myisamisam資料表就更是如此,它的缺點就是佔用磁碟空間;

     對於InnoDB表,因為它的資料行內部儲存格式對固定長度的資料行和可變長度的資料行不加區分(所有資料行共用一個表頭部分,這個表頭部分存放著指向各個有關資料列的指標),所以使用char型別不見得會比使用varchar型別好。事實上,因為char型別通常要比varchar型別佔用更多的空間,所以從減少空間佔用量和減少磁碟i/o的角度,使用varchar型別反而更有利。

       (2varchar(30)30的涵義

     最大儲存30個字元;varchar5)和(200)儲存hello所佔空間一樣,但後者在排序時會消耗更多記憶體,因為order by col 採用fixed_length計算col長度(memory)引擎一樣。

     For example, a varchar(255) column can hold a string with a maximum length of 255 characters(字元而非位元組),對於latin1, ‘abcd’的L4,儲存需要5個位元組;對於ucs2(雙位元組字元),則需要10個位元組儲存(最大長度為510>255,故需要額外2個位元組)

       (3int20)中20的涵義

     20表示最大顯示寬度為20,但仍佔4個位元組儲存,儲存範圍不變;

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這樣設計?

    對大多數應用沒有意義,只是規定一些工具用來顯示字元的個數;int(1)int(20)儲存和結算均一樣。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21374452/viewspace-2136268/,如需轉載,請註明出處,否則將追究法律責任。

相關文章