当前位置: 首页 > 后端技术 > Node.js

Mysql数据类型最详解

时间:2023-04-03 12:34:32 Node.js

文章首发于公众号:程序员周先森。本平台不定期更新,喜欢我的文章,请关注我的微信公众号。数据库中的事务是最重要的概念之一,所以上一篇文章重点介绍了数据库中事务的使用,并举例说明了在实际开发中如何使用事务进行数据库操作。而且我们也知道Mysql中列的数据类型有很多种,而大多数人可能只是知道如何使用这些不同的数据类型,所以本文主要详细说一下Mysql中的各种数据类型。Mysql数据类型分类Mysql中常用的数据类型有四种:字符串数据类型、日期/时间数据类型、数值数据类型和二进制数据类型。字符串数据类型:主要包括以下数据类型:char、varchar、tinytext、mediumtext、text、longtext、enum、set。日期/时间数据类型:主要包括以下数据类型:date,time,datetime,timestamp,year。数值数据类型:主要包括以下数据类型:tinyint、smallint、mediumint、int、bigint、float、double、decimal。二进制数据类型:主要包括以下数据类型:tityblob、blob、mediedblob、longblob。约束在开始正式解释数据类型之前,我们需要了解如何为字段添加一些基本的约束。Mysql可以给字段添加的常见约束有:unsigned、zerofill、notnull、default、primarykey、auto_increment、uniquekey、foreignkey。unsigned:无符号类型,加上这个约束值不能取负数,只能应用于数值型数据列。zerofill:当数据长度不够时,在数据前面的指定长度上加0,该字段会自动添加一个无符号约束。notnull:这个很好理解,给字段增加一个非空约束。default:如果插入的数据没有指定值,则使用默认值。primarykey:给字段添加主键约束。一张表只能有一个主键,但可以和其他字段组合成一个主键。它通常与auto_increment约束一起使用。auto_increment:只能应用于数值类型,字段可以自动递增,默认从1开始。一般与主键配合使用。uniquekey:设置唯一约束,字段的值不能有重复数据,null除外。foreignkey:外键约束,保证数据的完整性和唯一性,多表连接表操作。字符串类型char数据类型定义:可以定义一个固定长度的字符串,长度范围在1-255个字符之间,创建表时必须指定长度,否则会被定义为char(1)默认情况下,当存储字符时,如果字符串没有达到指定的长度,空格会被填充到指定的长度。使用方式:当我们需要涉及一些固定长度的数据列时,可以使用char数据类型,比如手机号用char(11),身份证号用char(18),char(3)用户性别。Varchar数据类型定义:可以定义一个变长的字符串,理论上最多可以存储255字节的数据。但是如果在创建的时候指定了varchar(x),那么只能存储不超过x个字符的数据。与char类型的区别:其实我们更多的时候使用varchar数据类型,因为char类型不管存储的数据长度多少都会占用定义的字节数,而varchar只会占用实际字符串长度+1字节。但是char的查询效率比varchar高,所以在存储固定长度的时候,我们可以先选择char数据类型。使用方式:一般varchar类型可以用于名字等长度不定的数据列,一般中文名字为2到5个字符,所以我们定义为varchar(15)。tinytext数据类型定义:tinytext也是一个变长字符串,最多可以存储不超过255字节的变长文本。缺点:定义tinyint数据类型时不允许设置默认值,检索时没有大小写转换,效率低于char和varchar。所以一般情况下,很少使用这种数据类型。Mediumtext数据类型定义:mediumtext也是一个变长字符串,可以存储不超过16k字节的变长文本。缺点:mediumtext和tinytext都属于text系列数据类型,所以缺点是一样的。使用方法:mediumtext一般用于存储长文本操作,当varchar的存储范围不匹配时。一般使用mediumtext存储长文本就可以满足操作。Text数据类型定义:text也是一个变长字符串,可以存储不超过64k字节的变长文本。缺点:text也属于text系列数据类型,所以缺点和上面一致。使用方式:text一般用于mediumtext存储范围不满足时存储长文本操作,一般用于用户文章存储。Longtext数据类型定义:longtext也是一种变长字符串,最多可以存储不超过4G字节的变长文本。缺点:longtext也属于text系列数据类型,所以缺点和上面一致。使用方法:longtext最长可以存储不超过4G的明文,但一般情况下很少需要这种数据类型。枚举数据类型定义:ENUM是一个字符串对象,字段的取值范围可以通过ENUM来限定。如果插入数据时该字段的值不是可选值之一,则空字符串或NULL将替换用户要插入的值。枚举集合的长度最多不超过64K。缺点:不推荐使用ENUM来限制数据库中的取值范围,因为其实有很多坑。比如ENUM使用下标获取值,但是下标是从1开始的,因为0是为空串保留的,或者在ENUM中,0和"0"是不同的。如果用0作为下标来操作,会报错,因为ENUM下标是从1开始的。如果用“0”来操作,最后会插入一个空字符串,因为下标0是为空保留的.串起来的。因此不推荐使用ENUM在数据库层面限制字段的取值范围。使用方式:比如用户性别,我们可以在建表的时候使用ENUM来限制取值范围只能是男性或者女性。集合数据类型定义:如果数据列定义为集合,则可以存储集合,集合长度最大不能超过64k。set和enum的区别:enum定义了数据列的取值范围,但插入的值永远只能有一个值。但是set可以设置数据列的取值范围,但是插入值的时候可以插入多个值。使用方式:如果我们需要保存集合数据,我们可以将该字段设置为一个集合集合然后设置一个取值范围,然后在插入的时候在取值范围内取多个值组成一个集合进行插入。.日期/时间数据类型Mysql有多种数据类型可以用来存储时间或日期。比如我们可以用date来存储日期,year来存储年份,time来存储时间。您可以使用datetime或timestamp来存储日期和时间的组合。接下来,让我们看看这些日期/时间数据类型。日期数据类型定义:用于存储日期,存储范围为'1000-01-01'到'9999-12-31'。使用方法:可用于存储年、月、日数据列。例如,要存储用户的出生日期,我们可以使用日期数据类型进行存储。时间数据类型定义:用于存储时间,不仅可以表示一天中的时间,还可以用来表示两次之间的时间间隔。取值范围为'-838:58:59'到'838:59:59'。使用方法:很多朋友看到这里可能会怀疑自己的眼睛。时间的取值范围是'-838:58:59'到'838:59:59'?其实这个取值范围可以这样理解:DHH:MM:SS,也就是如果要存储时间间隔,就存储时间间隔乘以小时作为小时。因为这个时间的使用比较复杂,我们用sql语句来看几种不同格式的时间的插入效果:简单的插入一个当前时间就省时间了:如果只用一个冒号,就只有小时和分钟了存,秒存为00:没有冒号时,时分存为00,只存秒:在时间前加一个-2表示两天前开始的事件,所以保存的结果小时为-2*24+1最后保存为-49:00:00:time前面加一个2表示事件会在两天后开始,所以保存的结果小时为2*24+1最后保存为49:00:00:可以直接用数字保存,就是不要输入空格和冒号:year数据类型定义:这个很简单,就是保存一个年份值。使用方式:比如我们需要记录图书出版年份,可以使用year数据类型。Datetime数据类型定义:datetime可用于保存时间和日期的组合格式,存储范围为1000-01-0100:00:00至2039-01-1911:14:07。一般有两种保存方式:yyyy-mm-ddHH:MM:SS或yyyymmddHHMMSS。使用方式:这个很常见,比如下单的时候,或者下单的时候支付。时间戳数据类型定义:timestamp其实和datetime有类似的功能,只是范围更小。时间戳的存储范围是从1970-01-0100:00:00到9999-12-3123:59:59。使用方式:这个很常见,比如下单的时候,或者下单的时候支付。数值数据类型正如刚才提到的,数值数据有很多种。不同的类型有不同的存储范围,需要的存储空间也不同。数值类型可以带符号,可以设置正负值。tinyint数据类型定义:存储整型数据,大小为1个字节,如果保存有符号值,取值范围为-128到127,如果保存无符号值,取值范围为0到255。smallint数据类型定义:存储整型数据,大小为2字节,如果保存有符号值,取值范围为-32768到32767,如果保存无符号值,取值范围为0到65535。Mediumint数据类型定义:存储整型数据,大小为3个字节,如果保存有符号值,取值范围为-8388608到8388607,如果保存无符号值,取值范围为0到16777215。Int数据类型定义:存储整型数据,大小为4字节,如果保存有符号值,取值范围为-2147683648到2147683647,如果保存无符号值,取值范围为0到4294967295。bigint数据类型定义:存储整数数据,大小为8字节,如果保存有符号值,取值范围为-2^63到2^63-1,如果保存无符号值,取值范围为0到02^64-1。float数据类型定义:存储浮点数据,大小为4字节,浮点类型不能设置为无符号,取值范围为-1.175494351e-38到1.175494351e-38。double数据类型定义:存储浮点型数据,大小为8字节,浮点型不能设置为unsigned,精度会高于float,取值范围为-2.2250738585072014e-308到2.2250738585072014e-308.小数数据类型定义:常用于存储精确的小数,可以设置存储的字节数和保留的小数位数。最大存储字节数为65,默认为10。小数点最大位数为30,默认为0。使用方法:可以经常使用小数来保存金额或整数值,因为金额一般以固定小数位保存。二进制数据类型定义:二进制数据类型可以存储任何数据,不仅可以是文本数据,还可以是图像或多媒体数据。二进制数据类型其实比其他数据类型用的少,因为一般都是文件上传到OSS做CDN加速。有四种数据类型:tinyblob、blob、mediumblob和longblob。这些数据类型的区别在于存储范围。tinyblob:最大存储长度为255字节。blob:最大存储长度为64k。mediumblob:最大存储长度为16M。longblob:最大存储长度为4G。**缺点:**存储过多的文件会影响数据库的性能。欢迎关注公众号:程序员周先森。文章原发于微信公众号,本平台不定时更新。