一、字元與位元組與編碼關係
ascii碼中,乙個英文本母(不分大小寫)佔乙個位元組的空間,乙個中文漢字佔兩個位元組的空間。乙個二進位制數字序列,在計算機中作為乙個數字單元,一般為8位二進位制數,換算為十進位制。最小值0,最大值255。
utf-8編碼中,乙個英文本元等於乙個位元組,乙個中文(含繁體)等於三個位元組。
unicode編碼中,乙個英文等於兩個位元組,乙個中文(含繁體)等於兩個位元組。
二、varchar與char區別
char固定長度的型別:char(m)型別的資料列裡,每個值都占用m個位元組,如果某個長度小於m,mysql就會在它的右邊用空格字元補足.(在檢索操作中那些填補出來的空格字元將被去掉). varchar可變長度的型別:在varchar(m)型別的資料列裡,每個值只占用剛好夠用的位元組再加上乙個用來記錄其長度的位元組(即總長度為l+1位元組)
在mysql中用來判斷是否需要進行對資料列型別轉換的規則
在mysql中,char和varchar都表示字串型別.但他們儲存和檢索資料的方式並不相同.
在表結構定義中宣告char和varchar型別時,必須指定字串的長度.也就是該列所能儲存多少個字元(不是位元組,是字元).例如:char(10)和varchar(10)都能儲存10個字元.
宣告為char的列長度是固定的,char的長度可選範圍在0-255之間.也就是char最大能儲存255個字元.如果該列是utf8編碼,則該列所占用的位元組數=字元數3.如果是gbk編碼則該列所占用的位元組數=字元數2.
宣告為varchar的列長度是可變的,mysql5.7.2 varchar的長度範圍為0-65535個位元組.採用varchar型別儲存資料需要1-2個位元組(長度超過255時需要2個位元組)來儲存字串的實際長度.如果該列的編碼為gbk,每個字元最多占用2個位元組,最大長度不能超過32766個字元.如果該列的編碼為utf8,每個字元最多佔3個位元組,最大字元長度為21845.
總結:char和varchar最大的不同就是乙個是固定長度,乙個是可變長度.由於是可變長度,因此儲存的是實際字串再加上乙個記錄字串長度的位元組。如果分配給char或varchar列的值超過 列的最大長度,則對值進行裁剪.
varchar(m)和char(m),m都表示字元數.varchar的最大長度為65535個位元組(字元長度為utf8下21845),不同的編碼所對應的最大可儲存的字元數不同.char最多可以存放255個字元,不同的編碼最大可用位元組數不同.
三、utf8和gbk編碼下的計算方式例項
gbk下: 若乙個表只有乙個varchar型別,如定義為
create table t4(c varchar(n)) charset=gbk;
則此處n的最大值為(65535-1-2)/2= 32766。
減1的原因是實際行儲存從第二個位元組開始』;
減2的原因是varchar頭部的2個位元組表示長度;
除2的原因是字元編碼是gbk。
utf8下:
create table t4(c int, c2 char(30), c3 varchar(n)) charset=utf8;
則此處n的最大值為 (65535-1-2-4-30*3)/3=21812
減1和減2與上例相同;
減4的原因是int型別的c佔4個位元組;
減30*3的原因是char(30)占用90個位元組,編碼是utf8。
mysql中char與varchar的區別
char是一種固定長度的型別,varchar則是一種可變長度的型別 char m 型別的資料列裡,每個值都占用m個位元組,如果某 個長度小於m,mysql就會在它的右邊用空格字元補足 在檢索操作中那些填補出來的空格字元將被去掉 在varchar m 型別的資料列裡,每個值 只占用剛好夠用的位元組再加...
mysql中char與varchar的區別分析
在mysql教程中char與varchar的區別呢,都是用來儲存字串的,只是他們的儲存方式不一樣罷了,char有固定的長度,而varchar屬於可變長的字元型別。char與varchar的區別 char 13 長度固定,如 www.jb51.net 儲存需要空間 12個字元 varchar 13 可...
mysql中char與varchar的區別分析
char與varchar的區別 char 20 長度固定,如 www.jb51.net 儲存需要空間 20個字元 varchar 20 可變長 如 www.jb51.net 需要儲存空間 12 1 13字元,從上面可以看得出來char 長度是固定的,不管你儲存的資料是多少他都會都固定的長度。而var...