MySQL基本操作整理(七)、MySQL数据类型

今天整理MySQL中的数据类型,这对理解每个数据库表的设计是非常有帮助的。对于该部分,主要以了解为主,不要求熟练记住每种数据类型对应的取值范围等,在实际的开发过程中,会应用就可以了。

MySQL中的数据类型按照大类分,主要分为三类:数值型、字符型和日期型。下面分别介绍每种数据类型。

一、数值型

数值型分为整数类型小数类型,小数类型又可分为定点数浮点数,其中定点数的精度更高。

1. 整型

MySQL中的整型分为Tinyint, Smallint, Mediumint, Int/Integer, Bigint,分别占据1,2,3,4,8个字节。默认是有符号的,符号位占一位,负数用补码表示。
在这里插入图片描述
以Tinyint为例
无符号位,很好计算,最小值0,最大值直接2^8-1=255;
有符号数,符号位占1位,剩余7位,
正数:因此正数能表示的最大值为2^7-1=127;
负数:负数用补码表示,如要计算-128的补码,先计算绝对值的原码,然后全部取反再加一
-128 —>128的原码:1000 0000 —>全部取反:0111 1111 —>加1: 1000 0000 (Tinyint的最小负数)
  -1 —> 1的原码: 0000 0001 —>全部取反:1111 1110 —>加1: 1111 1111 (Tinyint的最大负数)

整型的特点:
① 如果不设置无符号还是有符号,默认是有符号,如果想设置无符号,需要添加unsigned关键字
② 如果插入的数值超出了整型的范围,会报out of range异常,并且插入临界值(如果自己配置过mysql的设置,这里不会报警告的异常,会直接报错,不能插入)
③ 如果不设置长度,会有默认的长度。长度代表了显示的最大宽度,如果不够会用0在左边填充,但必须搭配zerofill使用,并且只支持正数(所以unsigned加不加便无意义)

案例1:设置整型的无符号和有符号

CREATE TABLE tab_int(
	t1 INT,
	t2 INT UNSIGNED 
);
INSERT INTO tab_int VALUES(-123456, 123456); #正常插入
INSERT INTO tab_int VALUES(-123456,-123456); #第二个参数超范围,实际插入(-123456,0)
INSERT INTO tab_int VALUES(2147483648,4294967296);#两个数都超范围,实际插入(2147483647,4294967295)

案例2:设置整型的长度(也可以说是宽度)

CREATE TABLE tab_int(
	t1 INT(7),
	t2 INT(7) ZEROFILL 
);
INSERT INTO tab_int VALUES(123,123); #实际插入(123, 0000123)

2. 小数

小数分浮点型和定点型,浮点型分float(单精度浮点型)和double(双精度浮点型),定点型为decimal。
浮点型和定点型都可以指定精度,用M,D来表示,如float(M,D), double(M,D),dec(M,D)或者decimal(M,D)
在这里插入图片描述
单精度和双精度:
在这里插入图片描述
小数的特点:
①M和D的含义:
M:精度,整数部位+小数部位
D:标度,小数部位
如果超过范围,则插入临界值
②默认值情况:
M和D都可以省略
如果是decimal,则M默认为10,D默认为0(表示整数)
如果是float和double,则会根据插入的数值的精度来决定精度(无论什么数值都可以插入)
定点型的精确度较高,如果要求插入数值的精度较高如货币运算等则考虑使用

案例1:测试M和D

CREATE TABLE tab_float(
	f1 FLOAT(5,2),
	f2 DOUBLE(5,2),
	f3 DECIMAL(5,2)
);

INSERT INTO tab_float VALUES(123.45,123.45,123.45); #正常插入
INSERT INTO tab_float VALUES(123.456,123.456,123.456); #超小数范围,实际插入(123.46, 123.46, 123.46)
INSERT INTO tab_float VALUES(123.4,123.4,123.4);#未达到小数位数,实际插入(123.40,123.40,123.40)
INSERT INTO tab_float VALUES(1523.4,1523.4,1523.4);#超范围插入临界值,实际插入(999.99, 999.99, 999.99)

案例2:测试默认情况

CREATE TABLE tab_float(
	f1 FLOAT,
	f2 DOUBLE,
	f3 DECIMAL
);
INSERT INTO tab_float VALUES(123.4523,123.4523,123.4523);#decimal警告

原则:
所选择的类型越简单越好,能保存数值的类型越小越好。

二、字符型

我们将串数据都归结为字符型,其中的串数据可以是文本型也可以是二进制型。字符型主要分为较短的文本、较长的文本和其他类型。

分类:

  • 较短的文本:char、varchar 【★】
  • 较长的文本:text、blob(较大的二进制)
  • 其他类型包括:binary、varbinary用于保存较短的二进制,enum保存枚举型,set保存集合

char和varchar的对比:

类型 写法 M的意思 M的取值 特点 空间的耗费 效率
char char(M) 最大的字符数,可以省略,默认为1 0~255 固定长度的字符 比较耗费
varchar varchar(M) 最大的字符数,不可以省略 0~65535 可变长度的字符 比较节省

多说一句:char(M)无论插入的字符个数有没有达到M,开辟的空间都是M大小,而varchar(M)能根据实际插入的字符个数开辟空间。

案例1:测试enum

CREATE TABLE tab_char(
	c1 ENUM('a', 'b', '中国')
);

INSERT INTO tab_char VALUES ('a');
INSERT INTO tab_char VALUES ('中国');
INSERT INTO tab_char VALUES ('A'); #插入成功,插入'a'
INSERT INTO tab_char VALUES ('m'); #插入失败

案例2:测试set

CREATE TABLE tab_set(
	s1 SET('a','b','c','d')
);
INSERT INTO tab_set VALUES('a');
INSERT INTO tab_set VALUES('A,B'); #插入成功,插入'a,b'
INSERT INTO tab_set VALUES('a,c,d');

三、日期型

日期型主要分为五种类型:date、datetime、timestamp、time和year。其中需要重点区分的是datetime和 timestamp。
在这里插入图片描述
datetime和timestamp的区别:

  1. Timestamp支持的时间范围较小,取值范围:19700101080001–2038年的某个时间
    Datetime的取值范围:1000-01-01–9999-12-31
  2. timestamp和实际时区有关,更能反映实际的日期,而datetime则只能反映出插入时的当地时区
  3. timestamp的属性受mysql版本和SQLMode的影响很大

案例:测试 datetime 和 timestamp

CREATE TABLE tab_date(
	t1 DATETIME,
	t2 TIMESTAMP
);

INSERT INTO tab_date VALUES(NOW(),NOW());
SELECT * FROM tab_date;

查询结果:
在这里插入图片描述
修改时区再次测试:

SHOW VARIABLES LIKE 'time_zone';
SET time_zone='+9:00';
SELECT * FROM tab_date;

查询结果:
在这里插入图片描述
datetime和timestamp大PK

类型 字节 范围 时区等的影响
datetime 8 1000-9999 不受
timestamp 4 1970-2038
原创文章 97 获赞 43 访问量 1万+

猜你喜欢

转载自blog.csdn.net/shao_yc/article/details/106171105