数据类型都是啥啊 (MySQL数据类型与属性说明)

数据类型

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

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

数值类型

类型 大小 范围 无符号范围 用途
TINYINT 1 字节 (-128,127) (0,255) 小整数值
SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 字节 (-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个有效位。

扫描二维码关注公众号,回复: 11132764 查看本文章

计算机只能存储二进制,浮点数类型在存储的时候,必须转化成二进制。拿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。

日期\时间类型

类型 大小 范围 格式 用途
DATE 3字节 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3字节 ‘-838:59:59’/‘838:59:59’ HH:MM:SS 时间值或持续时间
YEAR 1字节 1901/2155 YYYY 年份值
DATETIME 8字节 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4字节 1970-01-01 00:00:00/2038,结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYYMMDD 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 |
+---------------------+

字符串类型

类型 大小 用途
CHAR 0-255字节 定长字符串
VARCHAR 0-65535 字节 变长字符串
TINYTEXT 0-255字节 短文本字符串
TEXT 0-65 535字节 长文本数据
MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
LONGTEXT 0-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合适。

二进制类型

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

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

字段属性

属性 用途
PRIMARY KEY 主键
DEFAULT 默认值
NULL 数据列可包含NULL值
NOT NULL 数据列不允许包含NULL值
INDEX 索引
AUTO_INCREMENT 自动递增,用于数值类型
UNSIGNED 无符号
COMMENT 字段描述
UNIQUE KEY 唯一键
CHARACTER SET name 指定字符集
ZEROFILL 填充符改为0,int型长度为4,存入3的时候会添加0003
UNSIGNED 数值取值范围翻倍,规定插入数值不能为负数
发布了168 篇原创文章 · 获赞 32 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_42534026/article/details/105731185