数据类型
1.整型
- 一个无符号数一定是非负数
create table t3(
age tinyint unsigned
);
- 显示宽度 (zerofill)
整型显示宽度, 位数不足时用 0 填充
create table t4(
id int(10) zerofill primary key auto_increment,
name char(32)
);
insert into t4 values(12345, '5个');
insert into t4 values(1234567890, '10个');
insert into t4 values(123456789012, '12个');
select * from t4;
2.浮点型
定点数的位数更加长 使用方式:
float(M,D)
double(M,D)
decimal(M,D)
M 是支持多少个长度, D 是小数点后面的位数
create table t5 (
a float(10, 2),
b double(10, 2),
c decimal(10, 2)
);
3. 字符串类型
CHAR 与 VARCHAR 类型的区别
思考:
字符串、浮点型等都可以随意指定大小, 那么是不是平时操作的时候随意指
定一个就可以呢?
答:不是, 数据类型并不是越大越好, 越大的类型会造成数据臃肿, 存储空间
占用过大, 数据检索也会变慢
4. 枚举(enum)
多选一的时候使用的一种数据类型
在前端使用单选框的时候, 枚举类型可以发挥作用
枚举类型的优点: 1. 限制了可选值
2. 节省空间
3. 运行效率高
create table t6(
name varchar(32),
sex enum('男','女','保密') default '保密'
);
-- 枚举类型的计数默认从1开始
insert into t6 set name='王宝强',sex=1;
5. 集合(set)
SET最多可以有64个不同的成员。类似于复选框, 有多少可以选多少。
create table t7 (
name varchar(32),
hobby set('吃','睡','玩','喝','抽')
);
insert into t7 values('张三','睡,抽,玩,吃,喝');
insert into t7 values('李四','睡,抽');
- 为什么不是用 set 类型?
在现代网站开发中, 多选框的值有上千个, 值存储的空没有索引用的多 - 那复选框的问题怎么解决?
将复选框的值单独设计成一张表
6. 时间类型
- datetime
create table datetime_test (
create_at datetime
);
insert into datetime_test values('2019-4-2 16:54:00');
insert into datetime_test values('2019/4/2 16:54:00');
insert into datetime_test values(now());
-- 年份最大支持4个长度
insert into datetime_test values('10000/4/2 16:54:00'); --
错误
insert into datetime_test values('9999/4/2 16:54:00');
2.time
create table time_test (
create_at time
);
insert into time_test values('12:12:12');
insert into time_test values('100:12:12');
insert into time_test values('-100:12:12');
insert into time_test values('10 10:12:12');
-- 时间的范围是: [-838:59:59 - 838:59:59]
insert into time_test values('839:12:12'); -- 错误的
3.timestamp 时间戳类型
时间戳类型在显示方面和datetime是一样的, 在存储上不一样
范围从 1970-1-1 0:0:0 到 2038-1-19 11:14:07
时间戳使用 4 个字节表示
该值大小与存储的位长有关: 2 ** (4 * 8 - 1)
create table timestamp_test (
create_time timestamp
);
insert into timestamp_test values(now());
insert into timestamp_test values('2038-1-19 11:14:07'); -
- 时间戳最大值
insert into timestamp_test values('2038-1-19 11:14:08'); -
- 错误
4.year
create table `year`(
create_at year
);
-- 从1900年开始 - 1900+255
insert into `year` values(now());
insert into `year` values('2155'); -- 年份最大值
insert into `year` values('2156'); -- 错误
7. 布尔型
create table `bool`(
cond boolean
);
insert into `bool` set cond=True; -- 成功
insert into `bool` set cond=False; -- 成功
insert into `bool` set cond=1; -- 成功
insert into `bool` set cond=10; -- 成功
insert into `bool` set cond=-1; -- 成功
insert into `bool` set cond=0; -- 成功
insert into `bool` set cond=0.1; -- 成功
insert into `bool` set cond='True'; -- 失败
8. 列的属性
插入的值是否可以为空
- null : 是可以为空,默认不写
- not null : 不可以为空,如果插入的时候,摸个字段的值为空,则报错
create table null_test (
id int primary key auto_increment,
username varchar(32) not null,
pwd varchar(16) null
);
insert into null_test values(null,null,null);
- default
create table default_test (
id int primary key auto_increment,
username varchar(32) default 'admin' not null,
pwd varchar(16) default 123456
);
insert into default_test (username) values ('admin');
- auto_increment
自动增长的列
默认从 1 开始
常配合主键使用的
create table auto_inc (
id int primary key auto_increment,
name varchar(32)
);
insert into auto_inc (name) values ('aaa'), ('bbb'),
('ccc');
select * from auto_inc;
/* 输出:
+----+------+
| id | name |
+----+------+
| 1 | aaa |
| 2 | bbb |
| 3 | ccc |
+----+------+
*/
- primary key
主键一般是唯一的标识
特性:不能为空,也不能重复,一张表当中只可以拥有一个主键
-- 这里只有一个主键,这种主键叫做联合主键, 在项目中使用较少
create table double_pri_test (
id int,
sid int,
primary key(id,sid)
);
insert into double_pri_test values (1, 1);
insert into double_pri_test values (1, 2); -- 成功
insert into double_pri_test values (2, 1); -- 成功
insert into double_pri_test values (1, 1); -- 失败
- unique
唯一键,保证列当中的每一个数据都不重复
邮箱不可以重复,手机号不可以重复
create table test_uniq (
id int auto_increment primary key,
mobile char(11) unique
);
insert into test_uniq set mobile=13999999999;
- comment
字段说明: 给开发者看的, 一般用来对相应字段进行说明
create table test_cmt (
ctime datetime comment '这个字段代表创建日期'
);
9. SQL注释
单行注释: – 你好
多行注释: /* 巴拉巴拉 */
MySQL 独有的单行注释: # 哈哈哈哈