跳到主要内容

任务二 MySQL数据类型

知识点​

1.什么是数据类型?MySQL提供了哪几大类数据类型?​

答:数据类型(Data Type)是指系统中所允许的数据类型,是数据的一种属性。MySQL数据库中的常量、变量和参数都有数据类型,使用MySQL数据库存储数据时,不同的数据类型决定了MySQL存储数据方式的不同。MySQL提供了多种数据类型,主要包括:数值类型(整数类型、浮点数类型、定点数类型、位类型)、日期和时间类型、字符串类型(文本字符串类型、枚举和集合类型、二进制字符串类型)。

2.MySQL支持哪5种整数类型?它们的字节数和取值范围分别是什么?​

答:(1)TINYINT:1字节,微整型。有符号:-128127,无符号:0255。 (2)SMALLINT:2字节,小整型。有符号:-3276832767,无符号:065535。 (3)MEDIUMINT:3字节,中整型。有符号:-83886088388607,无符号:016777215。 (4)INT(或INTEGER):4字节,整型。有符号:-21474836482147483647,无符号:04294967295。 (5)BIGINT:8字节,大整型。有符号:-92233720368547758089223372036854775807,无符号:018446744073709551615。

3.整数类型的UNSIGNED属性是什么意思?​

答:整数类型后面加UNSIGNED属性,表示使用无符号数据类型,取值范围不包含负数。例如:TINYINT UNSIGNED的取值范围是0255;如果不加UNSIGNED,取值范围是-128127。在MySQL数据表中,很多属性列的值要求为整数但不允许为负数,如年龄、人数、库存量等,此时可将其数据类型设置为INT UNSIGNED。

4.整数类型的(M)显示宽度和ZEROFILL属性有什么作用?​

答:(1)(M)属性表示指定显示宽度为M。显示宽度只用于显示,与取值范围无关,不能限制取值范围。若数值位数小于显示宽度,会在此数值前填充(一般配合ZEROFILL使用);若大于显示宽度,按类型的实际宽度保存。从MySQL 8.0开始,整数类型不再推荐使用显示宽度属性。

(2)ZEROFILL属性表示零填充,若数值宽度小于显示宽度,则在此数值左侧用字符0填充。当使用ZEROFILL属性时,由于负数不能设置零填充,系统自动将此数据列设置为UNSIGNED ZEROFILL属性。

5.MySQL支持哪几种小数类型?各有什么特点?​

答:(1)FLOAT:单精度浮点型,4字节,取值范围大但精度不高。 (2)DOUBLE:双精度浮点型,8字节,取值范围更大,精度比FLOAT高。 (3)DECIMAL(M,D)或DEC(M,D):定点数类型,M+2字节,用于表示高精度的小数,在MySQL内部以字符串形式存储,是精准的。M最大值为65(默认10),D最大值为30(默认0)。

浮点数类型适用于取值范围大且可容忍微小误差的场景;定点数类型适合对精度要求高的场景(如学生成绩、商品单价),推荐使用DECIMAL类型。

6.浮点数和定点数类型的(M,D)属性分别表示什么?​

答:(M,D)属性中,M称为精度,表示数字总位数(不包括小数点"."和负号"-"),D称为标度,表示小数点后的小数位数。对于浮点数类型,D的取值范围是030,M的取值范围是D255且不能大于M-2。对于定点数类型,M最大值为65,D最大值为30。当数据的小数位数超出范围时,定点数遵循四舍五入原则截断并出现"Data truncated"警告;整数部分超出范围时系统报错。

7.MySQL有哪几种日期和时间类型?各占多少字节?取值范围是什么?​

答:(1)YEAR:1字节,年份值,取值范围'1901''2155'。 (2)DATE:3字节,日期值,取值范围'1000-01-01''9999-12-31'。 (3)TIME:3字节,时间值,取值范围'-838:59:59''838:59:59'。 (4)DATETIME:8字节,日期时间值,不支持时区,取值范围'1000-01-01 00:00:00''9999-12-31 23:59:59'。 (5)TIMESTAMP:4字节,日期时间的时间戳,支持时区,取值范围'1970-01-01 00:00:01 UTC'~'2038-01-19 03:14:07 UTC'。

8.YEAR类型的输入格式有哪些?​

答:(1)4位字符串'YYYY'或4位数字YYYY:表示1901年2155年,推荐使用。 (2)2位字符串'YY'或2位数字YY:'01''69'或169表示2001年2069年;'70''99'或7099表示1970年~1999年。 (3)数字0表示0000年,字符'0'表示2000年。 从MySQL 5.5开始,2位格式的YEAR已不推荐使用,建议使用4位YYYY表示年份。

9.CHAR类型和VARCHAR类型有什么异同?​

答:相同点:CHAR(M)和VARCHAR(M)都表示可以存储M个字符(不是字节)。

不同点: (1)CHAR是固定长度,长度范围0255,占用M个字节;VARCHAR是可变长度,长度范围065535,占用(实际长度+1)个字节。 (2)CHAR当数据长度小于M时,后面填充空格达到指定长度,查询时自动删除尾部空格;VARCHAR当数据长度小于M时,实际长度即数据本身,不填补空格,查询时保留尾部空格。 (3)字符集对CHAR没有影响,CHAR(M)的M最大为255;字符集对VARCHAR有影响,如UTF8字符集下VARCHAR(M)的M最大为21845。 (4)CHAR类型的查询效率比VARCHAR类型快。

10.BINARY类型和VARBINARY类型有什么特点?​

答:BINARY(M)为固定长度的二进制字符串,M表示最多能存储的字节数,取值范围0~255。如果数据长度不足最大长度,将在数据后面用"\0"补齐。VARBINARY(M)为可变长度的二进制字符串,总字节数不能超过65535,除存储数据本身外还需1或2个字节存储字节数,必须指定M。

BINARY和VARBINARY以字节为存储单位,存储二进制字符串;而CHAR和VARCHAR以字符为存储单位,存储非二进制字符串。BINARY和VARBINARY区分大小写,而CHAR和VARCHAR不区分大小写。

11.TEXT类型和BLOB类型有什么异同?​

答:相同点:TEXT和BLOB都有4种类型(TINYTEXT/TEXT/MEDIUMTEXT/LONGTEXT和TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB),每种对应的最大长度相同。

不同点: (1)TEXT用于保存非二进制的长文本数据(如文章内容、评论),以文本方式存储;BLOB用于保存数据量很大的二进制数据(如图片、声音、视频),以二进制方式存储。 (2)TEXT区分大小写,BLOB不区分大小写。 (3)字符集对TEXT有影响,对BLOB无影响。 (4)TEXT和BLOB的执行效率低于CHAR和VARCHAR,建议只有需要保存大量数据时才使用。

12.ENUM类型和SET类型有什么特点和区别?​

答:ENUM类型(枚举类型):定义格式为ENUM('值1','值2','值3',…),数据只能从枚举列表中取一个值,类似单选。列表最多65535个值,占用1或2个字节(1255个成员占1字节,25665535个成员占2字节)。

SET类型(集合类型):定义格式为SET('值1','值2','值3',…),数据可以从列表中选择0个或多个值,类似复选。列表最多64个值,占用1~8个字节。

共同优势:规范数据本身,限定只能插入规定的数据项,节省存储空间,查询速度比CHAR、VARCHAR快。列表中的值可以使用中文但必须设置支持中文的字符集。均不能插入列表之外的其他数据。

13.如何根据实际需求选择合适的数据类型?​

答:(1)若数据将来可能参与数学计算(如商品库存增减、学时、成绩等),推荐使用数字类型。 (2)若只用来显示,推荐使用字符串类型。 (3)长度相同的字符串(如身份证号、学号、性别、电话号码、邮政编码等),采用CHAR类型。 (4)长度不固定的字符串(如姓名、课程名、地址、密码等),采用VARCHAR类型。 (5)大段文本(如新闻、评论、简历、备注等),声明为TEXT类型。 (6)多媒体文件(如照片、声音、视频等),声明为BLOB类型。 (7)日期时间或时间间隔,选择日期时间类型。 (8)只有男女或已婚未婚等布尔值,选择ENUM类型。 (9)兴趣爱好等可多选的,采用SET类型。 (10)表的主键推荐使用整数类型,处理效率更高,查询速度更快。