MySQL數(shù)據(jù)庫varchar的限制規(guī)則說明
MySQL數(shù)據(jù)庫中varchar最大長度是多少?其實這不是一個固定的數(shù)字,varchar的長度是有限制規(guī)則的。本文我們就來介紹一下MySQL數(shù)據(jù)庫中varchar的限制規(guī)則,并以一個實際的例子對限制規(guī)則進(jìn)行了說明,接下來就讓我們一起來了解一下這部分內(nèi)容。
1、限制規(guī)則
字段的限制在字段定義的時候有以下規(guī)則:
a)存儲限制
varchar字段是將實際內(nèi)容單獨存儲在聚簇索引之外,內(nèi)容開頭用1到2個字節(jié)表示實際長度(長度超過255時需要2個字節(jié)),因此最大長度不能超過65535。
b)編碼長度限制
字符類型若為gbk,每個字符最多占2個字節(jié),最大長度不能超過32766;
字符類型若為utf8,每個字符最多占3個字節(jié),最大長度不能超過21845。
若定義的時候超過上述限制,則varchar字段會被強行轉(zhuǎn)為text類型,并產(chǎn)生warning。
c)行長度限制
導(dǎo)致實際應(yīng)用中varchar長度限制的是一個行定義的長度。MySQL要求一個行的定義長度不能超過65535。若定義的表長度超過這個值,則提示ERROR1118(42000):Rowsizetoolarge.Themaximumrowsizefortheusedtabletype,notcountingBLOBs,is65535.YouhavetochangesomecolumnstoTEXTorBLOBs。
2、計算例子
舉兩個例說明一下實際長度的計算。
a)若一個表只有一個varchar類型,如定義為createtablet4(cvarchar(N))charset=gbk;則此處N的最大值為(65535-1-2)/2=32766。
減1的原因是實際行存儲從第二個字節(jié)開始';
減2的原因是varchar頭部的2個字節(jié)表示長度;
除2的原因是字符編碼是gbk。
b)若一個表定義為createtablet4(cint,c2char(30),c3varchar(N))charset=utf8;則此處N的最大值為(65535-1-2-4-30*3)/3=21812。
減1和減2的原因與上例相同;
減4的原因是int類型的c占4個字節(jié);
減30*3的原因是char(30)占用90個字節(jié),編碼是utf8。
如果varchar超過上述的b規(guī)則,被強制轉(zhuǎn)成text類型,則每個字段占用定義長度為11字節(jié),當(dāng)然這已經(jīng)不是“varchar”了。
關(guān)于MySQL數(shù)據(jù)庫中varchar的限制規(guī)則的知識就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!
相關(guān)文章
mysql時間戳格式化函數(shù)from_unixtime使用的簡單說明
mysql中的FROM_UNIXTIME函數(shù)可以數(shù)據(jù)庫中整型類的時間戳格式化為字符串的日期時間格式,下面這篇文章主要給大家介紹了關(guān)于mysql時間戳格式化函數(shù)from_unixtime使用的簡單說明,需要的朋友可以參考下2022-08-08MySQL通過DQL實現(xiàn)對數(shù)據(jù)庫數(shù)據(jù)的條件查詢
這篇文章給大家介紹了MySQL如何通過DQL進(jìn)行數(shù)據(jù)庫數(shù)據(jù)的條件查詢,文中通過代碼示例和圖文結(jié)合介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-01-01探討:MySQL中如何查詢當(dāng)前正在運行的SQL語句
本篇文章是對在MySQL中如何查詢當(dāng)前正在運行的SQL語句進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06