暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL快速入门之四-MySQL 数据类型介绍

在MySQL Server中的数据库创建表格时,表名、列名、列的数据类型必须指定,列的约束根据需要添加。下图为使用MySQL Workbench在MySQL Server中创建表格时的界面。下面对列的数据类型进行详细介绍。

(一)MySQL数据类型概述

下图为在MySQL Workbench中设计表格时为列选择数据类型的界面。可见,MySQL的数据类型的数量非常多。

按类别,MySQL的数据类型可分为文本字符串类型、整数类型、浮点类型、定点数类型、日期时间类型、二进制字符串类型、位类型、枚举类型、集合类型、JSON类型和空间数据类型共11类,如下表所示。

(二)MySQL常用数据类型介绍

(1)字符串类型:CHAR(M)、VARCHAR(M)和TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT

1)CHAR(M)、VARCHAR(M)

①用于存储字符串;

②M表示可填入的最大字符数目。如CHAR(2)和VARCHAR(2)表示最多能填入2个字符。此时在对应列中填入“张三”可顺利填入,而填入“张无忌”则会提示输入数据长度过长的错误;

③两者的区别主要有两个方面:

(a)一是支持最长字符长度的区别:CHAR(M)中的M的取值范围为0-255,支持的最长字符数目为255;VARCHAR(M)中的M的取值则比较复杂,其受MySQL最大行长度(65535个字节)和MySQL使用的字符集限制,但一般都在15000个字符以上。比如MySQL选取的字符集为uft8mb4,且只有一列时,M的最大取值为16383;若增加一列,且该列数据类型为INT时,M的最大取值为16382;若选取的字符集为gbk时,且只有一列时,M的最大取值为32766;若增加一列,且该列数据类型为INT时,M的最大取值为32764;

(b)二是存储内容格式的区别:CHAR(M)以固定长度存储字符串。如对CHAR(5),若存储的内容为“张三”,由于该字符串的长度为2,不够5,所以MySQL存储的时候会在其末尾补三个空格存储,存储为“张三   ”;但从数据库中读取该列的数据时,又会自动删除字符串后面的空格,读出来的数据仍然是“张三”;VARCHAR(M)按字符串的实际长度存储字符串,VARCHAR为VARIABLE CHAR即可变长度字符串的意思。如对VARCHAR(5),若存储的内容为“张三”,则MySQL存储的时候仍然为“张三”,不会像CHAR(5)一样在其后面补3个空格。

2)TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT

①统称为TEXT类型,用于存储字符串;

②各种类型的区别是能存储的最长字符串长度不同,如下表所示:

(2)整数类型:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT

①用于存储整数;

②各种类型的区别为表示整数的范围不同,如下表所示:

这里提到每个整数类型又分为有符号数和无符号数,下图为在MySQL Workbench中设置有符号数和无符号数的方法。

③这些类型还有一个可选参数M,即TINYINT(M)、SMALLINT(M)、MEDIUMINT(M)、INT(M)、BIGINT(M),如TINYINT(4),SMALLINT(6)、MEDIUMINT(9)、INT(11)、BIGINT(20)。下图为在MySQL Workbench中设置数据类型为TINYINT(4)的示例。

M 为显示宽度,表示当数据宽度小于M位的时候在数字前面需要用字符“0”填满宽度,但该项功能需要勾选“Zero Fill”使用,否则设置无效。且M与数据类型可存储的数值范围无关。从MySQL 8.0.17开始,不推荐使用显示宽度属性(即不建议使用勾选Zero Fill)。

问题:对下图设置,若在age列中输入“20”,将显示为什么内容?

答:显示的内容为“020”,如下图所示:

问题:对下图设置,能否在age列输入数字“-23”?又能否输入数字“200”?又能否输入数字“258”?

答:不能输入数字“-23”,因为为“Unsigned”无符号数类型;能输入数字“200”,因为TINYINT无符号数的范围为“0-255”;不能输入数字“258”,因为TINYINT无符号数的范围为“0-255”。

问题:对下图设置,即设置为TINYINT(1),能否在age列输入数字“115”?又能否输入数字“-113”?又能否输入数字“131”?

答:能输入数字“115”和“-113”,不能输入数字“131”。这是因为TINYINT(1)并不是表示只能输入一位数字,其不影响该数值类型的表示范围,且此时TINYINT的设置为有符号数,表示范围为“-128~127”。

(3)浮点类型:FLOAT、DOUBLE

①用于存储小数;

②FLOAT为单精度浮点数,DOUBLE为双精度浮点数(称为浮点数是因为它们表示小数时小数点位置不是固定的);

③两者的区别是表示数字的范围不同,如下表所示:

(4)定点数类型:DECIMAL(M,D)

①用于存储小数;

②DECIMAL(M,D)称为定点数,这是因为它表示小数时小数点位置是固定的;

③M称为精度,D称为标度。D为小数位数,M-D为整数位数。M的取值范围为1~65,D的取值范围为0~30,且M>=D;如DECIMAL(5,2)表示的数的范围为多少?-999.99~999.99。

④如果用户指定的精度超出精度范围,则会四舍五入进行处理。如对DECIMAL(5,2),若输入的数据为999.346,则会存储为什么数据?则会存储为999.35。

(5)日期时间类型:YEAR、DATE、TIME、DATETIME、TIMESTAMP

①用于存储日期和时间;

②各种类型的说明如下:

(a)YEAR用于存储年份,占用存储空间为1个字节,表示格式为“YYYY”,表示范围为“1901~2155”;

(b)DATE用于存储日期,占用存储空间为3个字节,表示格式为“YYYY-MM-DD”,表示范围为“1000-01-01~9999-12-31”;

(c)TIME用于存储时间,占用存储空间为3个字节,表示格式为“HH:MM:SS”,表示范围为“-838:59:59~838:59:59”;表示范围中的时间超过23是因为该类型不但能表示一天之内的时间,而且可以表示一个时间间隔,而这个时间间隔可以超过 24 小时;

(d)DATETIME用于存储日期和时间,占用存储空间为8个字节,表示格式为“YYYY-MM-DD HH:MM:SS”,表示范围为“1000-01-01 00:00:00~9999-12-31 23:59:59”;

(e)TIMESTAMP用于存储日期和时间,占用存储空间为4个字节,表示格式为“YYYY-MM-DD HH:MM:SS”,表示范围为“1970-01-01 00:00:00 UTC~2038-01-19 03:14:07 UTC”;UTC表示世界统一时间,也叫作世界标准时间,存储数据的时候需要对当前时间所在的时区进行转换,查询数据的时候再将时间转换回当前的时区。因此,使用TIMESTAMP存储的同一个时间值,在不同的时区查询时会显示不同的时间。

(6)二进制字符串类型:BINARY(M)、VARBINARY(M)和TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB

1)BINARY(M)、VARBINARY(M)

①用于存储二进制数据,比如图片、音频、视频等二进制数据,具体内容形如“01101111 11110011 ......”;

②BINARY(M)、VARBINARY(M)与CHAR(M)和VARCHAR(M)类似,不同的是BINARY(M)、VARBINARY(M)存储的内容是原始的二进制数据,而CHAR(M)和VARCHAR(M)存储的是以一定格式编码的文本字符串。

2)TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB

①用于存储二进制数据,比如图片、音频、视频等二进制数据,具体内容形如“01101111 11110011 ......”;

②BLOB全称为“Binary Large OBject”,即“二进制大对象”,指的是图片、音频、视频等二进制表示的大容量文件;

③各种类型的区别是能存储的二进制数据大小不同,如下表所示:

④TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB和TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT类似,不同的是TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB存储的内容是原始的二进制数据,而TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT存储的是以一定格式编码的文本字符串。

文章转载自虚拟仪器技术及应用,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论