数据类型
创建表的完整语法
# 语法
create table 表名(
字段名1 类型(宽度) 约束条件,
字段名2 类型(宽度) 约束条件,
...
字段名n 类型(宽度) 约束条件
)
注意
-
在同一张表中字段名不能重复
-
宽度和约束条件是可选的(可写可不写),字段名和类型是必须的
约束条件写的话 也支持写多个 -
最后一行不能有逗号
宽度
一般情况下指的是对存储数据的限制
create table t1(name char);
默认字符宽度为1
5.6 版本默认没有开启严选模式 如果超出了一个字符,会自动截取
5.7版本以上默认开启了严选模式,超出了规定的长度会报错
严选模式开不开?
使用数据库的准则:能让数据库少干活就少干活,减轻负担
自动截取字符就属于让数据库多干了活,所以开了为好。(目前阶段不用纠结开不开,了解就好)
基本数据类型
整型
-
分类
TINYINT、SMALLINT、MEDUIMINT、INT、BIGINT -
作用
存储年龄、登记、ID、号码等。
以 TINYINT 为例
是否有符号
整型默认情况是带符号的
超出会如何
超出限制只存最大可接受值
以一个例子说明(可以对照敲一下,较高版本可能不会截断而是报错)
可以添加约束条件,变成无符号。create table t2(id tinyint unsigned);
整型关系的特例
create table t12(id int(8));
insert into t12 values(123456789);
"""
特例:只有整型括号里面的数字不是表示限制位数
id int(8)
如果数字没有超出8位 那么默认用空格填充至8位
如果数字超出了8位 那么有几位就存几位(但是还是要遵守最大范围)
即此时的范围仍是 int 的范围
"""
浮点型
-
分类
FLOAT、DOUBLE、DECIMAL -
作用
身高、体重、薪资
# 存储限制
float(255,30) # 总共255位 小数部分占30位
double(255,30) # 总共255位 小数部分占30位
decimal(65,30) # 总共65位 小数部分占30位
# 精确度验证
create table t3(id float(255,30));
create table t4(id double(255,30));
create table t5(id decimal(65,30));
insert into t3 values(1.111111111111111111111111111111);
insert into t4 values(1.111111111111111111111111111111);
insert into t5 values(1.111111111111111111111111111111);
float < double < decimal
# 要结合实际应用场景 三者都能使用
字符类型
"""
char
定长
char(4) 数据超过四个字符直接报错 不够个字符空格补全
varchar
变长
varchar(4) 数据超过四个字符直接报错 不够有几个存几个
"""
create table t6(name char(4));
create table t7(name varchar(4));
insert into t6 values('a');
insert into t7 values('a');
# 介绍一个小方法 char_length统计字段长度
select char_length(name) from t6;
select char_length(name) from t7;
"""
首先可以肯定的是 char硬盘上存的绝对是真正的数据 带有空格的
但是在显示的时候MySQL会自动将多余的空格剔除
"""
char 与 varchar 对比
char
缺点:浪费空间
优点:存取都很简单
直接按照固定的字符存取数据即可
jason egon alex wusir tank
存按照五个字符存 取也直接按照五个字符取
varchar
优点:节省空间
缺点:存取较为麻烦
1bytes+jason 1bytes+egon 1bytes+alex 1bytes+tank
存的时候需要制作报头
取的时候也需要先读取报头 之后才能读取真实数据
以前基本上都是用的 char 其实现在用 varchar 的也挺多
时间类型
-
分类
date:年月日 2023-5-4
datetime:年月日时分秒 2023-5-4 11:11:11
time:时分秒11:11:11
Year:2023create table student( id int, name varchar(16), born_year year, birth date, study_time time, reg_time datetime ); insert into student values(1,'xxx','2000','2000-11-11','11:11:11','2000-11-11 11:11:11');
枚举类型
-
分类
枚举(enum):多选一
集合(set):多选多(可以只选一个,但不能写没有列举的) -
使用
create table user( id int, name char(16), gender enum('male','female','others') ); insert into user values(1,'xxx','male'); 正常 insert into user values(2,'yyy','xxxxooo'); 报错 # 枚举字段 后期在存数据的时候只能从枚举里面选择一个存储 create table teacher( id int, name char(16), gender enum('male','female','others'), hobby set('read','DBJ','hecha') ); insert into teacher values(1,'aaa','male','read'); 正常 insert into teacher values(2,'bbb','female','DBJ,hecha'); 正常 insert into teacher values(3,'ccc','others','生蚝'); 报错