MySQL中的数据类型和字段属性(数据类型与属性说明)

本文深入解析MySQL中的数据类型,涵盖整数类型、浮点数类型、日期和时间类型、字符串类型及二进制类型,同时介绍了复合类型以及字段属性如主键、唯一键、非空约束等关键概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据类型

数据类型是数据的一种属性,其可以决定数据的存储格式,有效范围和相应的限制。

mysql的数据类型分为五种,包括整数类型,浮点数类型,日期和时间类型,字符串类型和二进制类型。

数值类型

类型大小范围无符号范围用途
TINYINT1 字节(-128,127)(0,255)小整数值
SMALLINT2 字节(-32 768,32 767)(0,65 535)大整数值
MEDIUMINT3 字节(-8 388 608,8 388 607)(0,16 777 215)大整数值
INT或INTEGER4 字节(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数值
BIGINT8 字节(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极大整数值

不必多说,存储数字的类型,是专门用来存储数值的,根据实际情使用对应的数值类型,唯一要注意的就是满足要求的同时,尽量使用小字节的数据类型。

例如:创建一个表,用于统计公司人数,年龄

mysql> create table test(id smallint,age tinyint);
Query OK, 0 rows affected (0.04 sec)

mysql> desc test;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | smallint(6) | YES  |     | NULL    |       |
| age   | tinyint(4)  | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

对于以上需求,使用mediumint就可满足要求,但考虑类型大小,选择了最适合的数值类型。

浮点数类型

类型大小范围无符号范围用途
FLOAT(M,D)4 字节(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(1.175 494 351 E-38,3.402 823 466 E+38)单精度,浮点数值
DOUBLE(M,D)8 字节(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)双精度,浮点数值
DECIMAL(M,D)对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2依赖于M和D的值依赖于M和D的值小数值

浮点类型后面的(M,D)中填写的是数字,表示精度和标度。M指的是数字总个数,D指的是小数的数字个数。例如:float(5,2)表示总长度为5,有2位小数,123.456添加进去时,基于MySQL保存值四舍五入的机制,最后保存到数据库中的值为123.46。

精准度

float:单精度浮点型,占字节数为4,用32位二进制描述,有符号是7个有效位,无符号是8个有效位

double:双精度浮点型,占字节数为8,用64位二进制描述,有符号是15个有效位,无符号是16个有效位

decimal:数字型,用128位二进制描述,不存在精度损失,28个有效位。

计算机只能存储二进制,浮点数类型在存储的时候,必须转化成二进制。拿float型来说,如果将一个float型数值转化为二进制后,若转化的数据小于32位或32位后都是0,那么数据是准确的,如果32位后不全为0,则数据就会存在误差。

精准度比较,创建一个超过float精准度范围的表

mysql> create table test3(num1 float(10,2),num2 double(10,2),num3 decimal(10,2));

往里面添加内容

mysql> insert into test3 values(9876543.21,9876543.21,9876543.21);

查看表的数据

mysql> select * from test3;
+------------+------------+------------+
| num1       | num2       | num3       |
+------------+------------+------------+
| 9876543.00 | 9876543.21 | 9876543.21 |
+------------+------------+------------+

float型存储的数值二进制超过32位后的部分不能确保精准,结果小数部分就变成了0。

日期\时间类型

类型大小范围格式用途
DATE3字节1000-01-01/9999-12-31YYYY-MM-DD日期值
TIME3字节‘-838:59:59’/‘838:59:59’HH:MM:SS时间值或持续时间
YEAR1字节1901/2155YYYY年份值
DATETIME8字节1000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值
TIMESTAMP4字节1970-01-01 00:00:00/2038,结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07YYYYMMDD HHMMSS混合日期和时间值,时间戳

对于时间和日期类型,就很简单,直接指定类型就可以了,连范围都不用加。

date类型使用

创建一个日期类型的表

mysql> create table test4(date date);

添加date型数据的两种方式

mysql> insert into test4 values('2020-2-23');
mysql> insert into test4 values(20200303);

查看记录是否成功

mysql> select * from test4;
+------------+
| date       |
+------------+
| 2020-02-23 |
| 2020-03-03 |
+------------+

time类型使用
创建一个时间类型的表

mysql> create table test5(time time);

添加time型数据的三种方式

mysql> insert into test5 values('23:23:23');
mysql> insert into test5 values('23:23');
mysql> insert into test5 values('232323');

查看记录

mysql> select * from test5;
+----------+
| time     |
+----------+
| 23:23:23 |
| 23:23:00 |
| 23:23:23 |
+----------+

year类型使用
创建一个年份类型的表

mysql> create table test6(year year);

添加一条记录

mysql> insert into test6 values(2020);

查看记录

mysql> select * from test6;
+------+
| year |
+------+
| 2020 |
+------+

datetime类型使用
范围1001年到9999年,精确到秒,使用8个字节存储。(建议目前使用timestamp类型)

创建一个日期加时间的表

mysql> create table test7(datetime datetime);

添加datetime型数据的两种方式,添加格式为:‘YYYY-MM-DD HH:MM:SS’

mysql> insert into test7 values('2020-2-22 23:23:23');
mysql> insert into test7 values(20200303222222);

查看记录

mysql> select * from test7;
+---------------------+
| datetime            |
+---------------------+
| 2020-02-22 23:23:23 |
| 2020-03-03 22:22:22 |
+---------------------+

timestamp类型使用
范围从1970年1月1日以来的秒数,到达2038年1月19结束。和linux时间戳相同,用4个字节存储空间。

创建一个日期和时间的表

mysql> create table test8 (datetime timestamp);

添加timestamp型数据的两种方式

mysql> insert into test8 values('2020-11-11 11:11:11');
mysql> insert into test8 values(20201010063030);

查看记录是否添加成功

mysql> select * from test8;
+---------------------+
| datetime            |
+---------------------+
| 2020-11-11 11:11:11 |
| 2020-10-10 06:30:30 |
+---------------------+

字符串类型

类型大小用途
CHAR0-255字节定长字符串
VARCHAR0-65535 字节变长字符串
TINYTEXT0-255字节短文本字符串
TEXT0-65 535字节长文本数据
MEDIUMTEXT0-16 777 215字节中等长度文本数据
LONGTEXT0-4 294 967 295字节极大文本数据

根据需求和存储,灵活的使用数据类型,例如,存储名称和简介。

mysql> create table test9(name char(4),intro varchar(100));

添加一条记录

mysql> insert into test9 values('张三','简介');

查看记录

mysql> select * from test9;
+--------+--------+
| name   | intro  |
+--------+--------+
| 张三   | 简介   |
+--------+--------+
char和varchar区别

char定义的长度是固定的,取值为0~255之间,若插入的数据不足,将使用空格填充,直到达到范围。

varchar定义的长度是可变长字符串,取值为0~65535。varchar类型只保存添加的字符,用一个字节来记录长度,开始符一个字节,结束符一个字节,不像char使用填充符。

varchar存储变长数据,但存储效率没有char高。从存储空间考虑,用varcahr合适,从效率上考虑,用char合适。

二进制类型

类型大小用途
TINYBLOB0-255字节不超过 255 个字符的二进制字符串
BLOB0-65 535字节二进制形式的长文本数据
MEDIUMBLOB0-16 777 215字节二进制形式的中等长度文本数据
LONGBLOB0-4 294 967 295字节二进制形式的极大文本数据

和字符串类型类似,只不过只能存储二进制数据。这几种BLOB类型最大的区别就是能够保存的最大长度不同。LONGBLOB的长度最大,TINYBLOB的长度最小。

复合类型

类型大小用途
enum1字节枚举,只能从enum()中取单一值
set1字节只能从set()取值

enum
枚举,只允许添加enum()中的数据,创建一个表,有id,姓名和性别字段。

mysql> create table test(id int(10),name char(5),sex enum('man','woman'));

查看结构

mysql> desc test;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| id    | int(10)             | YES  |     | NULL    |       |
| name  | char(5)             | YES  |     | NULL    |       |
| sex   | enum('man','woman') | YES  |     | NULL    |       |
+-------+---------------------+------+-----+---------+-------+

向表中添加记录,若sex不是man或woman,数据库就会报错

mysql> insert into test values(1,'张三','m');
ERROR 1265 (01000): Data truncated for column 'sex' at row 1

按要求插入记录,并查看是否成功·

mysql> insert into test values(1,'张三','man');
mysql> insert into test values(1,'李莉','woman');
mysql> select * from test;
+------+--------+-------+
| id   | name   | sex   |
+------+--------+-------+
|    1 | 张三   | man   |
|    1 | 李莉   | woman |
+------+--------+-------+

set
只能从set()中取值,插入其他值就会报错。

创建一个表,有id,姓名,值字段

mysql> create table test(id int(5),name char(5),type set('开发','测试','运维'));

查看表结构,其中只有三个值选择

mysql> desc test;
+-------+---------------------------------+------+-----+---------+-------+
| Field | Type                            | Null | Key | Default | Extra |
+-------+---------------------------------+------+-----+---------+-------+
| id    | int(5)                          | YES  |     | NULL    |       |
| name  | char(5)                         | YES  |     | NULL    |       |
| type  | set('开发','测试','运维')       | YES  |     | NULL    |       |
+-------+---------------------------------+------+-----+---------+-------+

插入其他数据就会报错

mysql> insert into test values(1,'张三','人事');
ERROR 1265 (01000): Data truncated for column 'type' at row 1

插入范围内的数据,查看记录

mysql> insert into test values(1,'张三','开发');
mysql> insert into test values(2,'李四','测试');
mysql> insert into test values(3,'王五','运维');
mysql> select *from test;
+------+--------+--------+
| id   | name   | type   |
+------+--------+--------+
|    1 | 张三   | 开发   |
|    2 | 李四   | 测试   |
|    3 | 王五   | 运维   |
+------+--------+--------+

enum常用于性别字段,set常用于职位字段。

字段属性

属性用途
PRIMARY KEY主键
DEFAULT默认值
NULL数据列可包含NULL值
NOT NULL数据列不允许包含NULL值
AUTO_INCREMENT自动递增,用于数值类型
COMMENT字段描述
UNIQUE KEY唯一键
CHARACTER SET name指定字符集
ZEROFILL填充符改为0,int型长度为4,存入3的时候会添加0003
UNSIGNED无符号,数值取值范围翻倍,规定插入数值不能为负数

primary key和unique key

primary key:叫做主键,也称为主键约束,是表中唯一标识每条记录的列,对表实施完整性约束。其作用就是使表中不含有重复的记录。

特点:
一个表中只能定义一个主键属性。
主键值必须唯一标识表中的记录,即主键数据表中唯一,不可能存在两行相同的主键值。
主键字段的数据不能为空(null)

unique key:叫做唯一键,用来保证字段中数据的唯一性,字段不能重复。

特点:
唯一键在一张表中可以存在多个。
唯一键允许字段类型为null,并且可以添加多个为null的记录。

创建一个表,有id,姓名,电话号码字段,其中id为主键,电话号码为唯一键。

mysql> create table test(id int(10) primary key,name char(5),phone int(10) unique key);

查看表结构

mysql> desc test;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(10) | NO   | PRI | NULL    |       |
| name  | char(5) | YES  |     | NULL    |       |
| phone | int(10) | YES  | UNI | NULL    |       |
+-------+---------+------+-----+---------+-------+

向表中添加记录,除主键外(主键不能为null),其他字段都可添加null。

mysql> insert into test values(null,null,null);
ERROR 1048 (23000): Column 'id' cannot be null
mysql> insert into test values(1,null,null);

查看添加的记录

mysql> select * from test;
+----+------+-------+
| id | name | phone |
+----+------+-------+
|  1 | NULL |  NULL |
+----+------+-------+

not null和null

not null为非空约束,在字段中使用not null,用户添加记录时如果没有添加数据,数据库就会报错。null表示该字段可以为空,用户添加记录时没有添加数据,就会以null填充,字段默认属性为null。

空值是不占用空间的,mysql中的null是占用空间的,就像是一个空容器一样。

创建一个表,有id,姓名,年龄字段,其中只有null为空值。

mysql> create table test1(id int(10),name char(5) not null,age tinyint(3) not null);

没有为id字段指定属性,默认属性为null,其他字段使用非空约束。

mysql> desc test1;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | int(10)    | YES  |     | NULL    |       |
| name  | char(5)    | NO   |     | NULL    |       |
| age   | tinyint(3) | NO   |     | NULL    |       |
+-------+------------+------+-----+---------+-------+

在其中添加记录,在有非空约束属性的字段中不添加数据会产生报错,而null属性的字段并不受影响。

mysql> insert into test1 values(null,null,23);
ERROR 1048 (23000): Column 'name' cannot be null
mysql> insert into test1 values(null,'张三',23);

这里不添加任何数据,并不是可以直接省略id字段,在数据库中的空值也是有值的,那就是null。查看记录是否插入成功。

mysql> select * from test1;
+------+--------+-----+
| id   | name   | age |
+------+--------+-----+
| NULL | 张三   |  23 |
+------+--------+-----+

default

default是默认值约束,用来指定某字段的默认值,如果用户没有为字段插入数据,则以默认值填充,默认值为null。

创建一个表,有id和姓名字段,其中姓名字段指定默认值

mysql> create table test2(id int(10),name char(5) default '机密');

查看表结构,Default就是字段的默认值,其中姓名字段默认值为机密

mysql> desc test2;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(10) | YES  |     | NULL    |       |
| name  | char(5) | YES  |     | 机密    |       |
+-------+---------+------+-----+---------+-------+

只对id字段添加数据

mysql> insert into test2 (id)values(1);

查看插入的记录

mysql> select * from test2;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 机密   |
+------+--------+

comment

comment用来为字段和表添加注释,在字段或表属性的最后添加。

例如:create table (***)comment ‘测试’;
这就是为表添加字段

创建一个表,有id和姓名字段,并为id字段和表添加注释。

mysql> create table test3 (id int(3) primary key comment '员工数量',name char(10))comment '员工信息';

对于描述的查看,并不会在表中或结构中显示,只能通过查询SQL语句中查看

mysql> show create table test3\G
*************************** 1. row ***************************
       Table: test3
Create Table: CREATE TABLE `test3` (
  `id` int(3) NOT NULL COMMENT '员工数量',
  `name` char(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='员工信息'

auto_increment

auto_increment为数值型字段的自动增长, 表明mysql应该自动为该字段生成一个唯一没有用过的数(如果一条记录id为1,那么删除1,新添加的会是2)。只适用于整数类型的字段,数值从1开始,每增加一条记录,系统默认加1,不需要手动插入。

auto_increment常用于记录的计数字段,员工人数,记录条数等按顺序加1的字段。

创建一个表,有id,姓名字段,id字段为主键,并且设置自动递增。

mysql> create table test4(id int(10) primary key auto_increment,name char(5));

查看表的结构,Extra下面就是自动递增

mysql> desc test4;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(10) | NO   | PRI | NULL    | auto_increment |
| name  | char(5) | YES  |     | NULL    |                |
+-------+---------+------+-----+---------+----------------+

只为name字段添加三条记录

mysql> insert into test4 (name)values('张三'),('李四'),('王五');

查询记录

mysql> select *from test4;
+----+--------+
| id | name   |
+----+--------+
|  1 | 张三   |
|  2 | 李四   |
|  3 | 王五   |
+----+--------+

zerofill与unsigned

可以转到===>传送<===查看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚伪的空想家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值