一、MySQL下的类型
整型
TINYINT , SMALLINT , INT , BIGINT
小数
- 浮点数(不是高精度) FLOAT/DOUBLE
- 保证精度 DECIMAL/NUMEROUS
几个坑
- bit 显式的时候是 ASCII 码
- CHAR 最多 255 个字符
- VARCHAR 最多是 65535 个字节,具体多少字符65535/3(每个utf8 占 3 字节)
字符类型
- 定长 CHAR(字符个数)
- 变长 VARCHAR(字符个数)
- TEXT 字符(常用于特别长的文字,文章)
- BLOB 字节流
日期、时间
- DATETIME 年-月-日 时:分:秒
- DATE 年-月-日
- TIME 时:分:秒
- TIMESTAMP 时间戳(1970 的秒数)
TIMESTAMP | DATETIME |
---|---|
4 个字节 | 8 个字节 |
1970 - 2037年 | 0000-9999年 |
MySQL 规范上不建议使用 ENUM 和 SET
- 修改表结构的代价非常大
- ENUM/SET 信息保存在表结构中
- 所以,更新 ENUM 及 SET 都需要修改表结构,风险较大
- 所以不建议使用
带括号的数据类型
- CHAR(字符个数,会影响字段长度)
- VARCHAR(字符个数,会影响字段长度)
- BIT(位的长度,会会影响字段长度)
- FLOAT(整体的显式位数,小数点后显式位数;不影响字段长度)
- INT(显式长度,不影响字段长度) ZEROFILL
二、NULL
NULL 不区分大小写
NULL 的真实含义时,这个字段值不知道
所以一般来说,有 NULL 参与的运算结果都是 NULL
定义表时,字段后可以跟 NOT NULL 强制不允许出现空
没有特殊理由,建议都加上 NOT NULL
主键
-
主键,每个信息都有主键,用来唯一标识一条信息
可以是一个字段,可以是多个字段组成(复合主键) -
在 InnoDB 的引擎下,数据在硬盘存储是按照主键的排序方式存储的,为了避免中间插入主键,通常建议把主键设置成一个永远递增,永不修改的值
-
主键不允许为空/主键不允许重复
-
每个表上都有一个主键,通常用自增字段作为主键
唯一键
唯一键 Unique Key
相似的点:主键和唯一键都不允许重复
不同点:
- 主键不允许为空,唯一键允许为空
- 存储上,数据的存储是按照 主键 递增顺序保存的
唯一键,看作另外有一套数据结构
举个栗子
创建一个学生表
//注意最后一行不能有逗号!!!
CREATE TABLE students (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT "利用自增字段作为表主键",
sn INT NOT NULL UNIQUE COMMENT "学号,事实上的主键,唯一键,不允许重复",
name VARCHAR(10) NOT NULL COMMENT "姓名",
gender TINYINT NOT NULL COMMENT "性别: 1 女 2 男 3 不想说",
school VARCHAR (40) NOT NULL DEFAULT "西安财经大学" COMMENT "学校",
registerd_at DATETIME NOT NULL COMMENT "报名时间",
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "入表时间"
) COMMENT "学生表";
CREATE TABLE students (
...
PRIMARY KEY (id, sn) -- 支持单字段 或者 多字段
UNIQUE KEY (sn, name)
)
insert into students(sn,name,gender,registerd_at) values (125,"王五",2,"2019-9-9 21:44:20");