MySQL CHAR VARCHAR
char允許的最大字元數為255,是字元數;而varchar主要是最大行位元組數,是位元組數,並且是行位元組數,即create table時所有varchar列相加。
意思就是:每一列都可以定義char的字元數為255,而定義varchar,需要一張表中所有varchar列的最大位元組數的和(注:還包括標識消耗的位元組,長度標識和NULL標識)不超過varchar的最大行位元組數(預設是2^16-1=65535)
我寫的不太好,可以直接去看這個博主的文章,剛學習回來。
學習文章:可以直接過去看看,這個博主寫的很好,通俗易懂
MySQL中VARCHAR最大長度是多少?CHAR和VARCHAR有哪些區別?
建立一個表,9列都為varchar型別,那麼varchar(M)可以定義多少?
結果如下:
create table k(a varchar(7279),b varchar(7279),c varchar(7279),d varchar(7279),e varchar(7279), f varchar(7279),g varchar(7279),i varchar(7279),j varchar(7283)) charset latin1;
為什麼j列是7283,而不是7284?
計算公式:
2^16-1(varchar的最大位元組長度)-2*9(9列的長度標識消耗的位元組數)-9/8(9列允許空,1列NULL就用1bit標識,那麼就是9bit,8bit=1byte)-8*7279(8列的總位元組)=7283
以上的計算方式可以詳細看這篇文章,作者講的很好。
MySQL中VARCHAR最大長度是多少?CHAR和VARCHAR有哪些區別?
記錄長度,之所以每一列需要2個位元組是因為:
varchar記錄長度需要1-2個位元組,當長度不超過255個位元組,需要1位元組標識長度,而超過255個位元組,則需要2個位元組標識長度。
為什麼?
因為1位元組=8位,2^8-1=255,
而大於255,小於65535,用二進位制2個位元組就夠了,2位元組=16位,2^16-1=65535,和varchar的預設最大行長度剛好相等。
其中,對於NULL的標識的解釋:
NULL的標識是每一行的資料共有的,而不是每一列共有,同一行共有NULL標識,並且同一行所有的位元組加起來就得是2^16-1
而每一列都可以為NULL,那麼每一列都需要一bit來標識NULL,但是他們是一行資料來標識NULL,上方的表中,一共有9列,那麼一行資料就應該有9個bit來標識NULL,而1byte(位元組)=8bit,所以9/8=2(向上取整)
上方超鏈的博主的原文:
如果有一個列允許為空,則需要1 bit來標識,每8 bits的標識會組成一個欄位,該欄位會存放在每行最開始的位置。
注意,這個標識位不是放在每列,而是每行共享。
假設一張表中存在N個可空欄位,NULL標識位需要
N/8(向上取整)個位元組