mysql char与varchar类型, 行的大小限制
char
和varchar
类型相似,但它们被存储和检索的方式不同。它们的最大长度以及是否保留尾随空格也不同。
char和varchar声明,其长度表示最大字符数。比如char(30),表示最多存储30个字符。
char
列被固定在创建表声明的长度。范围是0到255之间的任何值。char
存储值时,将在它们的右边填充空格以达到指定的长度。当CHAR
被检索到的值,拖尾的空格被删除,除非 PAD_CHAR_TO_FULL_LENGTH
启用SQL模式。
varchar列是可变长度的字符串。范围是0到65535之间的值。有效最大长度 VARCHAR
取决于最大行大小(65,535字节,在所有列之间共享)和所使用的字符集。
与相比char
, varchar
值存储为1字节或2字节长的前缀加数据。长度前缀指示值中的字节数。如果值需要不超过255个字节,则列使用一个长度字节;如果值可能需要不超过255个字节,则列使用两个长度字节。
Value | CHAR(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)