2019年度数据库管理系统:MySQL
目录
SQL支持的数据类型
大家在学习C的时候会接触到int, str,float等数据类型,在学习python的时候也会接触到数据类型:如int, string,list, dict等。在不同编程的语言中,不同数据类型有自己的特性。这里我们要学习的MySQL也有自己的一套数据类型。
My SQL支持的数据类型与其他数据库管理系统(DBMS)基本相同,按种类可以分为:Numeric,Date and Times, String, Spatial,JSON。
整型数值型类型
知识点1:各个数据类型的类型和范围
知识点2:INT(4)中4的含义是指添加ZERO FILL时的显示长度
整型数值类型:https://dev.mysql.com/doc/refman/8.0/en/integer-types.html
在设定表中属性的数据类型时,我们可以额外设定各个数据的显示长度,如INT(4),显示长度不影响数据本身的长度,如一个TINYINT(4)的数据占用的空间与一个TINY(3)占用的空间时是相同的。
mysql中设置了储存类型后,储存是定长的,也就是说,int(1) 和 int(4) 在硬盘中所占的字节数都是一样的。
我们知道,int类型占4个字节,tinyint占1个字节。int(1) 和 int(4) 从本身长度还是存储方式上都是一样的,区别就是显示的长度不同,但是要设置一个参数:如果列制定了zerofill 就会用0填充显示,int(4)指定后就会显示为0002。
从数据占用存储空间的大小来看:int(1)和tinyint(4) 相比,肯定int 大。
注意数字类型后面括号中的数字,不表示长度,表示的是显示宽度,这点与 varchar、char 后面的数字含义是不同的。tinyint一个字节 smallint 两个字节 MEDIUMINT三个字节
也就是说不管 int 后面的数字是多少,它存储的范围始终是 -2^31 到 2^31 - 1。
显而易见,int(1) 和 tinyint(1) ,在设计数据库的时候应该选择tinyint(1)。所占的储存空间越少越好,当然要够用才行。像这样储存一个 个位数的字段,还是用tinyint(1)的好。
关于“数据类型(长度)”的总结
- 规定类型之后,存储是定长的,int(1)和int(4)从本身长度还是存储方式上都是一样的。mysql里,int(1)和int(4)的区别就是显示的长度,但是要设置一个参数:如果列制定了zerofill 就会用0填充显示,如2 int(3)指定后就会显示为002
- int 存储占4个字节, tinyint 存储占1个字节,存储长度决定了他们表示的数字范围不同。int表示的数字范围是:从 -2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647) 的整型数据(所有数字)。tinyint 表示的范围是0-255之间的数字。
- tinyint(1),和tinyint(3)没什么区别,存123都能存的下,而如果tinyint(3) zerofill 的话,插入值 12,会存储012,zerofill自动左边补零,这才是限制显示长度。
更多关于整型数据说明的参考资料:在这里我们能学习到MySQL中数值与布尔变量之间的关系:
https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html
固定浮点数DECIMAL
知识点:DECIMAL(P,D)中P和D的含义与取值范围
MySQL DECIMAL数据类型用于在数据库中存储精确的数值。我们经常将DECIMAL数据类型用于保留准确精确度的列,例如会计系统中的货币数据。
要定义数据类型为DECIMAL的列,请使用以下语法:
column_name DECIMAL(P,D);
在上面的语法中:P是表示有效数字数的精度。 P范围为1〜65。
D是表示小数点后的位数。 D的范围是0~30。MySQL要求D小于或等于(<=)P。
DECIMAL(P,D)表示列可以存储D位小数的P位数。十进制列的实际范围取决于精度和刻度。
与INT数据类型一样,DECIMAL类型也具有UNSIGNED和ZEROFILL属性。 如果使用UNSIGNED属性,则DECIMAL UNSIGNED的列将不接受负值。
如果使用ZEROFILL,MySQL将把显示值填充到0以显示由列定义指定的宽度。 另外,如果我们对DECIMAL列使用ZERO FILL,MySQL将自动将UNSIGNED属性添加到列。
以下示例使用DECIMAL数据类型定义的一个叫作amount的列。
amount DECIMAL(6,2);
在此示例中,amount列最多可以存储6位数字,小数位数为2位; 因此,amount列的范围是从-9999.99到9999.99。
MySQL允许使用以下语法:
column_name DECIMAL(P);
这相当于:
column_name DECIMAL(P,0);
在这种情况下,列不包含小数部分或小数点。
此外,我们甚至可以使用以下语法。
column_name DECIMAL;
在这种情况下,P的默认值为10。
更多关于DEMICAL知识的参考资料:
https://dev.mysql.com/doc/refman/8.0/en/fixed-point-types.html
https://blog.csdn.net/qq_34306360/article/details/79721619
浮点类型FLOAT,DOUBLE
知识点:默认的float类型都只能存6个数字(包括小数点前后的位数),整数超过6位就被科学计数表示(id=4),小数位超出则需要四舍五入
对于单精度浮点数Float: 当数据范围在±131072(65536×2)以内的时候,float数据精度是正确的,但是超出这个范围的数据就不稳定,没有发现有相关的参数设置建议:将float改成double或者decimal,两者的差别是double是浮点计算,decimal是定点计算,会得到更精确的数据。
更多关于FLOAT、DOUBLE的参考资料:
该内容额外包含:在将来的MySQL版本中,FLOAT(M,D)的用法即将被删除,因此这里不要求大家掌握。
https://dev.mysql.com/doc/refman/8.0/en/floating-point-types.html
二进制数据类型BIT
BIT数据类型中,它的值是一个二进制位,不是0就是1,类似Boolean类型中的True和False。
BIT类型是数据的插入总结:
使用【b ' 二进制数据 ' 】这种方式, 是二进制整形常量,这种二进制的整形常量,存储到bit 类型列的时候,也是按照二进制字面数值来存储的,而不是按照ascii的值,非常好用,但是,需要注意的是:
数据不能超过列类型表达的范围,如把 b'11'存入到 bit(1) 中,就会包data too long
b' ' ,这个单引号中间的部分,只能出现 0 或者 1,若出现了其他数据,如2 等,则会报语句解析错误。
更多关于BIT数据类型的介绍:
讲解了BIT插入1时为何显示49的原因
https://blog.csdn.net/hemeinvyiqiluoben/article/details/50441718
时间数据类型
时间数据类型和对应值的形式:
DATETIME
用于表示 年月日 时分秒,是 DATE 和 TIME 的组合,并且记录的年份(见上表)比较长久。如果实际应用中有这样的需求,就可以使用 DATETIME 类型。
TIMESTAMP
- TIMESTAMP 用于表示 年月日 时分秒,但是记录的年份(见上表)比较短暂。
- TIMESTAMP 和时区相关,更能反映当前时间。当插入日期时,会先转换为本地时区后再存放;当查询日期时,会将日期转换为本地时区后再显示。所以不同时区的人看到的同一时间是 不一样的。
- 表中的第一个 TIMESTAMP 列自动设置为系统时间(CURRENT_TIMESTAMP)。当插入或更新一行,但没有明确给 TIMESTAMP 列赋值,也会自动设置为当前系统时间。如果表中有第二个 TIMESTAMP 列,则默认值设置为0000-00-00 00:00:00。
- TIMESTAMP 的属性受 Mysql 版本和服务器 SQLMode 的影响较大。
如果记录的日期需要让不同时区的人使用,最好使用 TIMESTAMP。
DATE
DATE 用于表示 年月日,如果实际应用值需要保存 年月日 就可以使用 DATE。
TIME
TIME 用于表示 时分秒,如果实际应用值需要保存 时分秒 就可以使用 TIME。
YEAR
YEAR 用于表示 年份,YEAR 有 2 位(最好使用4位)和 4 位格式的年。 默认是4位。如果实际应用只保存年份,那么用 1 bytes 保存 YEAR 类型完全可以。不但能够节约存储空间,还能提高表的操作效率。
字符串类型
知识点:注意CHAR和VARCHAR的区别
MySQL支持的字符串类型:
经常用到的是CHAR,VARCHAR,ENUM以及TEXT
CHAR和VARCHAR类型
都用于存储较短的字符串,二者主要的区别为存储方式不同,CHAR的长度固定,VARCHAR的长度可变,检索时,CHAR删除尾部的空格,VARCHAR则保留尾部的空格。
用法区别的介绍
https://blog.csdn.net/weixin_43054397/article/details/91126605
ENUM类型
枚举类型,它的值范围需要在创建表时通过枚举方式显式指定,对于1-255个成员的枚举需要1个字节存储,对于255-65535个成员,需要2个字节来存储。最多允许有65535个成员。ENUM类型忽略大小写,当插入值不在枚举的范围内时,不会报错,会将第一个值插入。
具体的实现方法可以参考官方网页
https://dev.mysql.com/doc/refman/8.0/en/enum.html
其他博客关于ENUM关键字的介绍:
https://www.cnblogs.com/jiayu123/p/11333809.html