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
完