MySQL VARCHAR型別欄位到底可以定義多長

guocun09發表於2020-09-24

MySQL 單行行長最大是65535,不包含TEXT,BLOB型別。

varchar 長度小於255時,需要額外使用1位元組儲存長度,大於255時,需要 額外使用2位元組儲存長度。

varchar 欄位如果不定義not null 時,預設null也需要佔1位元組

lantin1字符集儲存的每個值佔1位元組

gbk 字符集儲存的每個值佔2位元組

utf8 字符集儲存的每個值佔3位元組


那麼一行varchar到底可以定義多長呢?
lantin1長度=65535-儲存長度大小 - default NULL大小

gbk長度=(65535-儲存長度大小 - default NULL大小)/2

utf8長度=(65535-儲存長度大小 - default NULL大小)/3


舉例說明:

lantin1情況

lantin1 varchar設定兩個欄位sno小於255( 額外使用1位元組儲存長度),sname大於255( 額外使用2位元組儲存長度),所以單行varchar最大長度為: 

mysql> select 65535-1-2;
+-----------+
| 65535-1-2 |
+-----------+
|     65532 |
+-----------+
1 row in set (0.00 sec)


sno varchar(1) not null+sname varchar(65531) not null=65532,建表成功

mysql> create table my8(sno varchar(1) not null,sname varchar(65531) not null, primary key(sno)) CHARSET=latin1;
Query OK, 0 rows affected (0.03 sec)
mysql> drop table my8 ;
Query OK, 0 rows affected (0.01 sec)


再看sno varchar(1) not null+sname varchar(65532) not null>65532,建表失敗

mysql> create table my8(sno varchar(1) not null,sname varchar(65532) not null, primary key(sno)) CHARSET=latin1;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

如指定 not null  sno varchar(1) sname varchar(65531) 就不行,因為有一個隱含的default null還佔用1位元組,建表失敗

mysql> create table my8(sno varchar(1),sname varchar(65531) , primary key(sno)) CHARSET=latin1;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs


UTF8情況

UTF8 varchar設定兩個欄位sno小於255(額外使用1位元組儲存長度),sname大於255(額外使用2位元組儲存長度),utf8字符集儲存的每個值佔3位元組,所以單行varchar最大長度為: 

mysql> select (65535-1-2)/3;
+---------------+
| (65535-1-2)/3 |
+---------------+
|    21844.0000 |
+---------------+
1 row in set (0.00 sec)


sno varchar(1) not null+sname varchar(21844) not null>21844,建表失敗

mysql> create table my8(sno varchar(1) not null,sname varchar(21844) not null, primary key(sno)) CHARSET=utf8;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs


sno varchar(1) not null+sname varchar(21843) not null=21844,建表成功

mysql> create table my8(sno varchar(1) not null,sname varchar(21843) not null, primary key(sno)) CHARSET=utf8;
Query OK, 0 rows affected (0.02 sec)



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25583515/viewspace-2723947/,如需轉載,請註明出處,否則將追究法律責任。

相關文章