mysql char与varchar类型, 行的大小限制

charvarchar类型相似,但它们被存储和检索的方式不同。它们的最大长度以及是否保留尾随空格也不同。

char和varchar声明,其长度表示最大字符数。比如char(30),表示最多存储30个字符。

char列被固定在创建表声明的长度。范围是0到255之间的任何值。char存储值时,将在它们的右边填充空格以达到指定的长度。CHAR被检索到的值,拖尾的空格被删除,除非 PAD_CHAR_TO_FULL_LENGTH启用SQL模式。

varchar列是可变长度的字符串。范围是0到65535之间的值。有效最大长度 VARCHAR取决于最大行大小(65,535字节,在所有列之间共享)和所使用的字符集。

与相比charvarchar值存储为1字节或2字节长的前缀加数据。长度前缀指示值中的字节数。如果值需要不超过255个字节,则列使用一个长度字节;如果值可能需要不超过255个字节,则列使用两个长度字节。

 

ValueCHAR(4)需要存储VARCHAR(4)需要存储
'' '    ' 4 bytes '' 1 byte
'ab' 'ab  ' 4 bytes 'ab' 3 bytes
'abcd' 'abcd' 4 bytes 'abcd' 5 bytes
'abcdefgh' 'abcd' 4 bytes 'abcd' 5 bytes

varchar声明255是个临界值,大于就需要二个字节来记录字节数;小于则只需要一个字节来记录。

 

MySQL对每个表有4096列的硬限制。MySQL表的内部表示具有65,535字节的最大行大小限制。

mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),
       c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),
       f VARCHAR(10000), g VARCHAR(6000)) ENGINE=InnoDB CHARACTER SET 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
mysql> CREATE TABLE t2
       (c1 VARCHAR(65535) NOT NULL)
       ENGINE = InnoDB CHARACTER SET 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

占2个字节,所以应该缩小 <= 65533

mysql> CREATE TABLE t2
       (c1 VARCHAR(65533) NOT NULL)
       ENGINE = InnoDB CHARACTER SET latin1;
Query OK, 0 rows affected (0.01 sec)

 

posted @ 2021-02-24 15:02  落孤秋叶  阅读(637)  评论(0编辑  收藏  举报