天天看點

MySQL 建表字段長度的限制

在mysql建表時,遇到一個奇怪的現象:

MySQL 建表字段長度的限制
MySQL 建表字段長度的限制

疑問:

為什麼字段小(10000)的反而報錯,而大(30000)的則可以建立。為什麼小的不能直接轉換呢?

解決:

<a href="http://dev.mysql.com/doc/refman/5.1/en/silent-column-changes.html">http://dev.mysql.com/doc/refman/5.1/en/silent-column-changes.html</a>

(1)單個字段如果大于65535,則轉換為text 。

(2)單行最大限制為65535,這裡不包括text、blob。

按照上面總結的限制,來解釋出現的現象:

第一個情況是:

單個字段長度:varchar(10000) ,位元組數:10000*3(utf8)+(1 or 2) = 30000 ,小于65535,可以建立。

單行記錄長度:varchar(10000)*3,位元組數:30000*3(utf8)+(1 or 2) = 90000,大于65535,不能建立,是以報錯:

第二個情況是:

單個字段長度:varchar(30000) ,位元組數:30000*3+(1 or 2) = 90000 , 大于65535,需要轉換成text,才可以建立。是以報warnings。

單行記錄長度:varchar(30000)*3,因為每個字段都被轉換成了text,而text沒有限制,是以可以建立表。

MySQL 建表字段長度的限制
MySQL 建表字段長度的限制

用了這麼久的mysql,這個基本的建表限制都還不知道,慚愧啊。。

  被問到一個問題:mysql中varchar最大長度是多少?這不是一個固定的數字。本文簡要說明一下限制規則。

1、限制規則

字段的限制在字段定義的時候有以下規則:

a)                  存儲限制

varchar 字段是将實際内容單獨存儲在聚簇索引之外,内容開頭用1到2個位元組表示實際長度(長度超過255時需要2個位元組),是以最大長度不能超過65535。

b)                  編碼長度限制

字元類型若為gbk,每個字元最多占2個位元組,最大長度不能超過32766;

字元類型若為utf8,每個字元最多占3個位元組,最大長度不能超過21845。

若定義的時候超過上述限制,則varchar字段會被強行轉為text類型,并産生warning。

c)                   行長度限制

導緻實際應用中varchar長度限制的是一個行定義的長度。 mysql要求一個行的定義長度不能超過65535。若定義的表長度超過這個值,則提示

error 1118 (42000): row size too large. the maximum row size for the used table type, not counting blobs, is 65535. you have to change some columns to text or blobs。

2、計算例子

舉兩個例說明一下實際長度的計算。

a)                  若一個表隻有一個varchar類型,如定義為

create table t4(c varchar(n)) charset=gbk;

則此處n的最大值為(65535-1-2)/2= 32766。

減1的原因是實際行存儲從第二個位元組開始’;

減2的原因是varchar頭部的2個位元組表示長度;

除2的原因是字元編碼是gbk。

b)                  若一個表定義為

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。

       如果被varchar超過上述的b規則,被強轉成text類型,則每個字段占用定義長度為11位元組,當然這已經不是“varchar”了。

繼續閱讀