mysql varchar 的最大長度

mycolumn varchar(M),這裏的M是字符個數還是字節個數,M的最大是多少?

首先,這個官方文檔截圖,回答了所有問題


下面,中文解釋下

先說結論:
1. M 是字符的個數
2. M 的最大值 取決於 行字節數(這是個常量值,即65535)以及 建表時的charset

詳細是這樣的:
mysql中,任何一個表中,行字節數(即,所有column字節長度的和)必須 <=65535;
M的最大值,就是 (65535-prefixlength)/chaset中每個字符的字節數;
prefixlength的長度,會變的,取決於 我們存入的字符的個數(<=255時,prefixlength=1; >255時,prefixlength=2);
不過,既然我們在說 M的最大值,我們就認爲存入的字符個數肯定>255,所以,prefixlength總是==2

所以,M的長度就是:(65535-2)/chaset中每個字符的字節數


例如:
gbk時,每個字符 包含2個字節,所以,charset='gbk'時,varchar的最大長度是
(65535-2)/2=32766.5,即,varchar最大長度是 32766

drop table if exists t_32766;
-- 失敗,因爲長度 32767 超了
create table t_32766(v varchar(32767) not null default '') engine=InnoDB charset='gbk';
-- 成功
create table t_32766(v varchar(32766) not null default '') engine=InnoDB charset='gbk';


utf8時,每個字符 包含3個字節,所以,charset='utf8'時,varchar的最大長度是

(65535-2)/3=21844.33333333,即,varchar最大長度是 21844

drop table if exists t_21844;
-- 失敗,因爲長度 21845 超了
create table t_21844(v varchar(21845) not null default '') engine=InnoDB charset='utf8';
-- 成功
create table t_21844(v varchar(21844) not null default '') engine=InnoDB charset='utf8';


另外:

1. utf8存儲時,可以用1到6個字節來存儲的。即a, b, c用一個字節存儲;中文3個字節;還有些特殊的是6個字節,不過,mysql總是用3個字節(估計是因爲3字節以上的utf8用的很少把。猜的)

2. 我的mysql版本是:MySQL Community Server (GPL) 5.6.23




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章