MySQL基础教程——数据类型与表的约束

@

前言

在了解了MySQL关于数据库与表的操作后,我们来继续MySQL关于数据类型与表的约束等相关内容。

一、数据类型

(1) 数值类型

下面我们展示包含数值类型的表然后拿其中个别进行案例介绍,其他的都能触类旁通。
数值类型

1、tinyint类型

# 有符号
create table t1(num tinyint);

#无符号
create table tt2(num tinyint unsigned);

2、bit类型

bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。

如果我们有这样的值,只存放0或1,这时可以定义bit(1),这样就可以节省空间。

bit
值得注意的是bit字段在显示时,是按照ASCII码对应的值显示。

(2) 小数类型

1、float

float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节

2、decimal

decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数

decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0。如果m被省略,默认是10。且decimal的精度要比float高。

(3) 字符串类型

1、char

char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255

而在MySQL中无论汉字、字母还是数字都视为一个字符在表中存储。

2、varchar

varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节

当编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)。

3、char与varchar区别

char 与 varchar 在输入参数就确定其最大大小。char是定长的,而varchar是变长的,能在于其能够根据实际填入的内容来在最大大小内使用相应大小。定长的磁盘空间比较浪费,但是效率高。变长的磁盘空间比较节省,但是效率低。

(4) 日期类型

date : 日期 'yyyy-mm-dd' ,占用三字节
datetime : 时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节
timestamp : 时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节

(5) enum和set

enum:枚举,“单选”类型;
enum('选项1','选项2','选项3',...);

该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,....最多65535个;当我们添加枚举值时,也可以添加对应的数字编号。

set:集合,“多选”类型;
set('选项值1','选项值2','选项值3', ...);

该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,.... 最多64个。
set

insert

二、表的约束

真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。

(1) 空属性

null(默认的)和 not null(不为空)

null
可见在not null约束下,插入数据时,没有给教室数据插入会失败。

(2) 默认值 default

default
数据在插入的时候不给该字段赋值,就使用该默认值。值得注意的是 not null和defalut一般不需要同时出现,因为default本身有默认值,不会为空

(3) 列描述 comment

comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解。

mysql> create table person(
-> name varchar(20) not null comment '姓名',
-> age tinyint unsigned default 0 comment '年龄',
-> sex char(2) default '男' comment '性别');

通过desc查看不到注释信息,通过show可以看到。
show

(4) zerofill

mysql> create table t1(
-> a int(10) unsigned,
-> b int(10) unsigned
-> );

其实没有zerofill这个属性,int(10) 括号内的数字是毫无意义的。
在这里插入图片描述
在填加了zerofill属性后可见下面效果,如果有zerofill属性的数据宽度小于设定的宽度(这里设置的是5),就会自动填充0。
zerofill

(5) 主键primary key

primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。

primary key
一张表中最多只能有一个主键,但主键可添加多个字段为复合主键。

在这里插入图片描述

(6) 自增长 auto_increment

其当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值进行+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。然后自增长字段必须是整数,且整张表最多只能有一个自增长。
在这里插入图片描述

(7) 唯一键 unique

一张表中有往往有很多字段需要唯一性,数据不能重复,而unique就可以解决这个问题。唯一键的本质和主键差不多,但唯一键允许为空,而且可以多个为空,而空字段不做唯一性比较。

(8) 外键 foreign key

外键是用于定义主表和从表之间的关系。外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。

foreign key (字段名) references 主表(列)

在这里插入图片描述

结语

以上就是MySQL数据类型与表的约束的基本内容了。如果喜欢我的内容,请点赞、收藏加关注,多多支持我这个编程小白啊,以及欢迎各位在评论区讨论交流,并指出我的不足,谢谢大家。

posted @ 2026-08-19 15:44  _梦影  阅读(0)  评论(0)    收藏  举报