MySQL8 全部类型

数字类型

日期类型

 

字符串类型

CHAR和VARCHAR

表列数和行大小限制

MySQL每个表的硬限制为4096列,但对于给定的表,有效最大值可能更小。确切的列限制取决于几个因素:

表的最大行大小限制列的数量(也可能是size),因为所有列的总长度不能超过此大小。

各列的存储要求限制了适合给定最大行大小的列数。某些数据类型的存储要求取决于存储引擎,存储格式和字符集等因素。

存储引擎可能会施加额外的限制来限制表列数。例如, InnoDB每个表的限制为1017列。

即使存储引擎能够支持更大的行,MySQL表的内部限制最大行大小为65,535字节。BLOB和TEXT列只对行大小限制贡献9到12个字节,因为它们的内容与行的其余部分分开存储。

InnoDB中对innodb_page_size(4KB,8KB,16KB和32KB)的设置,表的最大行大小略小于半页。例如,对于默认的16KB InnoDB页面大小,最大行大小略小于8KB 。

比如:

复制代码

-- 此时最大行大小为66000,大于规定的65535
CREATE TABLE `test_max_row_size` (
    a VARCHAR(10000),
    b VARCHAR(10000),
    c VARCHAR(10000),
    d VARCHAR(10000),
    e VARCHAR(10000),
    f VARCHAR(10000),
    g VARCHAR(6000)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
> 1118 - 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
> 时间: 0.004s

复制代码

报错是因为最大行大小的限制是所有列共享,而不是对单独列的限制。

BINARY和VARBINARY

 BLOB和TEXT

 ENUM和SET

复制代码

-- SET类型,元素个数最大为64个
CREATE TABLE `test_set` (
  a SET('a001','a002','a003','a004','a005','a006','a007','a008','a009','a0010','a0011','a0012','a0013','a0014','a0015','a0016','a0017','a0018','a0019','a0020','a0021','a0022','a0023','a0024','a0025','a0026','a0027','a0028','a0029','a0030','a0031','a0032','a0033','a0034','a0035','a0036','a0037','a0038','a0039','a0040','a0041','a0042','a0043','a0044','a0045','a0046','a0047','a0048','a0049','a0050','a0051','a0052','a0053','a0054','a0055','a0056','a0057','a0058','a0059','a0060','a0061','a0062','a0063','a0064')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

复制代码

测试一下这两个类型

复制代码

CREATE TABLE `test_enum_set` (
  a SET('A','B','C'),
  b ENUM('男','女')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO test_enum_set VALUES('A,B','男')
> Affected rows: 1
> 时间: 0.009s

复制代码

如果你插入的值不在set之列,报错

INSERT INTO test_enum_set VALUES('D','男')
> 1265 - Data truncated for column 'a' at row 1
> 时间: 0s

如果你插入的值不在enum之列,也报错

INSERT INTO test_enum_set VALUES('C','人妖')
> 1265 - Data truncated for column 'b' at row 1
> 时间: 0s

对于set而言,插入重复的会过滤掉,不然怎么能叫set呢

INSERT INTO test_enum_set VALUES('A,A,A','女')
> Affected rows: 1
> 时间: 0.008s

数据类型存储要求

数字类型前面已经提到了,这里不再赘述。

时间类型

 枚举和集合类型

 

如果你想要表格的文件,我已经打包好了:https://github.com/Mysakura/DataFiles

那个 .pos 文件可以导入https://www.processon.com/ 来查看

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