序号系列文章1【MySQL】MySQL介绍及安装2【MySQL】MySQL基本操作详解3【MySQL】MySQL基本数据类型
文章目录
1,数字类型
MySQL的数据类型包括整型类型,浮点数类型,定点数类型,位(BIT)类型等。
1.1,整型类型
MySQL的整型类型用于保存整数,根据取值范围的不同,整数类型可划分为5种。
整数类型字节无符号数的取值范围有符号数的取值范围TINYINT10255-128127SMALLINT2065535-3276832767MEDIUMINT3016777215-83886088388607INT404294967295-21474836482147483647BIGINT8018446744073709551615-92233720368547748089223372036854774807
- 不同整数类型的取值范围是通过字节数计算出来的,一个字节数等于8位二进制数。例如,TINYINT类型无符号数的最大值为2^8-1(即为255), 有符号数的最大值为2^7-1(即为127)。其他类型的数据类型的取值范围根据同样的方法可得出。
- 若使用无符号数据类型,需要在数据类型右边添加UNSIGNED关键字。例如INT UNSIGNED表示无符号INT类型。
为了能够更好的理解整型以及其注意事项,实例如下
知识点:
- 在执行结果中,数据类型右边使用小括号数字标注了显示宽度。
- 默认情况下,显示宽度是该数据类型取值范围所能表示的最大宽度。
- 对于有符号类型,符号也占用一个宽度。例如,255的显示宽度是3,而-255的宽度显示是4.
- 显示宽度与取值范围无关,若数值的位数小于显示宽度,会填充空格,若大于显示宽度,则不会影响显示结果。
扩展1:为字段设置零填充和宽度操作
知识点:
- 设置零填充后,字段会自动设为无符号类型,因为负数不能使用零填充。
- 当数值超过显示宽度时,不填充零;当数值未达到显示宽度时,在左侧填充零。
扩展2:如何选择最适合的整型数据类型?
在选择使用何种整数类型的时候,我们只需要重点考虑两方面,即存储空间和可靠性。
一方面,用占用字节数少的整数类型可以节省存储空间;另一方面,要是为了节省存储空间,使用的整数类型取值范围太小,一旦遇到超出取值范围的情况,就可能引起系统错误 ,影响可靠性。
切记:在实际工作中,因系统故障产生的成本远远超过增加几个字段存储空间所产生的成本,所以建议在确保数据不会超过取值范围的情况下,再去考虑如何节省存储空间。
扩展3:各整数数据类型的使用场所
- TINYINT :一般用于枚举数据,比如系统设定取值范围很小且固定的场景。
- SMALLINT :可以用于较小范围的统计数据,比如统计工厂的固定资产库存数量等。
- MEDIUMINT :用于较大整数的计算,比如车站每日的客流量等。
- INT、INTEGER :取值范围足够大,一般情况下不用考虑超限问题,用得最多。比如商品编号。
- BIGINT :只有当你处理特别巨大的整数时才会用到。比如双十一的交易量、大型门户网站点击量、证券公司衍生产品持仓等。
1.2,浮点数类型
在MySQL中,存储的小数都是使用浮点数或定点数来表示的。浮点数的类型有2种,分别为单精度浮点数类型(float)和双精度浮点类型(double)。
数据类型字节数取值范围FLOAT4-2^1282 ^128,即-3.40E+38+3.40E+38DOUBLE8-2^1024~ 2^1024,即-1.79E+308~1.79E+308
知识点:
- 当浮点数类型使用unsigned修饰无符号时,取值范围将不包含负数。
- 浮点数的取值范围是理论上的极限值,但根据不同的硬件或操作系统,实际范围可能会小。
- 浮点数虽然取值范围很大,但精度并不高。float类型的精度为6位或7位,double类型的精度大约为15位。
- 如果给定的数值超出精度,可能会导致给定的数值与实际保存的数值不一致,发生精度损失。
- 当一个数字的整数部分和小数部分加起来达到7位时,第7位就会进行四舍五入操作。
- 要避免使用“=”来判断两个浮点数是否相等,因为浮点数是不准确的,存在精度损失。
为了能够更好的理解浮点数以及其注意事项,实例如下:
1.3,定点数类型
定点数类型(DECIMAL)通过DECIMAL(M,D)设置位数和精度。
- M表示数字总位数,不包括’.‘和’-',最大值为65,默认值为10。
- D表示小数点后的位数,最大值为30,默认值为0。 - 例如,DECIMAL(5,2)表示的取值范围为-999.99~999.99。
为了能够更好的理解定点数以及其注意事项,实例如下:
知识点:
- 系统会自动根据存储的数据来分配存储空间。若不允许保存负数,可通过unsigned修饰。
- 若小数部分超出范围,会进行四舍五入操作,并出现Data truncated(数据截断)警告。
- 若整数部分超出范围,数据会插入失败,提示Out of range value(超出取值范围)错误。
扩展1:定点数的存储空间
DECIMAL(M,D)的最大取值范围与DOUBLE类型一样,但是有效的数据范围是由M和D决定的。
定点数(DECIMAL) 的存储空间并不是固定的,是由精度值M来决定的,总共占用的存储空间为M+2个节。
也就是说,在一些对精度要求不高的场景下,比起占用同样字节长度的定点数,浮点数表达的数值范围可以更大一些。
扩展2:定点数与浮点数的对比及应用
- 定点数类型取值范围相对小,但是精准,没有误差。 - 适合于对精度要求极高的场景 (比如涉及金额计算的场景)
- 浮点数相对于定点数的优点是在长度一定的情况下,浮点类型取值范围大,但是不精准。 - 适用于需要取值范围大,又可以容忍微小误差的科学计算场景(比如计算化学、分子建模、流体动力学等场景)
扩展3:注意点及建议
- 浮点数类型也可以设置位数和精度,如float(8,2),但仍有可能会损失精度。
- 在实际使用时,我们应避免使用浮点数类型,以免出现不能人为控制的问题。
- 因此对于小数类型的设置,推荐使用定点数类型并设置合理的范围可以使计算更为精确。
1.4,BIT类型
BIT(位)类型用于存储二进制数据,语法为BIT(M),M表示位数,范围为1~64。
函数函数用途BIT(M)存储二进制数据ASCll(M)获取M的ASCll值BIN(M)获取M的二进制值LENGTH(M)获取M的数字长度
知识点:
- BIT类型字段在数字插入时转换为二进制保存,但在利用SELECT查询时,会自动转换为对应的字符显示。
- BIT类型,如果在创建时没有指定(M),默认是1位。这个1位,表示只能存1位的二进制值。
- 在向BIT类型的字段中插入数据时,一定要确保插入的数据在BIT类型支持的范围内。
1.5,直接常量
直接常量指的是在MySQL中直接编写的字面常量,如数字1253,字符串’abc’等,常用于在INSERT语句中编写插入的数据。
直接常量具有多种语法形式,可分为6类。
1)十进制数
十进制数:语法近似于我们日常使用的数字,如12,-12,-1.2,以及科学计数法1E2,1E-2(E不区分大小写)。
2)二进制数
二进制数:在二进制字符串前面加前缀b,形如b‘10000001’。
上述示例通过SECLECT b‘10000001’;语句可查看二进制转为ASCll字符后的结果,即字符A。
3)十六进制数
十六进制数:有两种表示方式,分别为:在十六进制字符串前面加前缀0x或在十六进制字符串前面加前缀x,形如0x‘41’或x’41’。
上述示例通过SECLECT 0x‘41’;语句可查看十六进制转为ASCll字符后的结果,即字符A。
上述示例通过SECLECT HEX(65);语句可查看十进制转为十六进制的结果,即41。
4)字符串
字符串:MySQL支持单引号和双引号定界符,形如"abc"和’abc’,推荐使用单引号定界符。
若要在单/双引号字符串中书写单/双引号,需要在单/双引号前面添加反斜杠\转义,即"\ ’ “和” \ " "。
常见转义字符:
转义字符含义转义字符含义\0空字符(NUL)\t制表符(HT)\r回车符(CR)\b退格(BS)\n换行符(LF)\ ’单引号\ "双引号%%(常用于LIKE条件)\ \反斜杠\ __(常用于LIKE条件)
5)布尔值
布尔值:TRUE和FALSE两个值(不区分大小写),通常用于逻辑判断,表示事物的真和假。
在SELECT,INSERT等语句中使用布尔值,TRUE会转换为1,FALSE会转换为0。
6)NULL值
NULL值:通常用于表示没有值,值不确定等含义。
例如,在插入一条商品数据时,暂时不知道该商品的库存量,可将此设为NULL。
2,时间和日期类型
为了方便在数据库中存储日期和时间,MySQL提供了表示日期和时间的数据类型。
- YEAR 类型通常用来表示年
- DATE 类型通常用来表示年、月、日
- TIME 类型通常用来表示时、分、秒
- DATETIME 类型通常用来表示年、月、日、时、分、秒
- TIMESTAMP 类型通常用来表示带时区的年、月、日、时、分、秒
为了更直观的学习这五种表示日期和时间的数据类型,简单归纳如下:
数据类型字节取值范围日期格式零值YEAR119012155YYYY0000DATE31000-01-019999-12-31YYYY-MM-DD0000-00-00TIME3-838:59:59838:59:59HH:MM:SS00:00:00DATETIME81000-01-01 00:00:009999-12-31 23:59:59YYYY-MM-DD HH:MM:SS0000-00-00 00:00:00TIMESTAMP41970-01-01 00:00:01~2038-01-19 03:14:07YYYY-MM-DD HH:MM:SS0000-00-00 00:00:00
知识点:
- 不同数据类型表示的时间内容不同、取值范围不同,而且占用的字节数也不一样,你要根据实际需要灵活选取。
- 为什么时间类型 TIME 的取值范围不是 -23:59:59~23:59:59 呢? - 原因是 MySQL设计的TIME 类型,不光表示一天之内的时间,还可以用来表示一个时间间隔,这个时间间隔可以超过 24小时。
2.1,YEAR类型
YEAR类型用来表示年份,在所有的日期时间类型中所占用的存储空间最小,只需要1个字节的存储空间,格式为YYYY。
在MySQL中,可使用以下3种格式指定TEAR类型的值:
- 使用4位字符串或数字表示,为’1901’'2155’或19012155。 - 例如,输入’2022’或2022,插入到数据库中的值均为2022.
- 使用两位字符串表示,为’00’
‘99’。 - ‘00’ ~ '69’的值会被转换为20002069的YEAR值- ‘70’ ~ '99’的值会被自动转换为1970~1999的YEAR值- 例如,输入’22’,插入到数据表中的值为2022。 - 使用两位数字表示,为1
99。 - 1 ~ 69的值会被转换为20012069的YEAR值- 70 ~ 99的值会被自动转换为1970~1999的YEAR值- 例如,输入22,插入到数据表中的值为2022。
知识点:
- 当使用YEAR类型时,一定要区分0和’0’。- 数字格式的0表示的YEAR值为0000- 字符串格式的’0’表示的YEAR值为2000
2.2,DATE类型
DATE类型用来表示日期值,不包含时间部分,需要 3个字节 的存储空间,且其格式为 YYYY-MM-DD 。其中,YYYY表示年份,MM表示月份,DD表示日期。
在MySQL中,可以使用以下4种格式指定DATE类型的值:
- 以’YYYY-MM-DD’或者’YYYYMMDD’字符串格式表示。
- 以’YY-MM-DD’或者’YYMMDD’字符串格式表示。
- 以YY-MM-DD或者YYMMDD数字格式表示。
- 使用CURRENT_DATE或者NOW()输入当前系统日期。
注意:
- 通过"SELECT CURRENT_DATE;"或者"SELECT NOW();"可查询当前日期。
- 日期中的分隔符"-“,还可以使用”.“”,“”/"等符号来表示。
2.3,TIME类型
TIME类型用于表示时间值,它的显示形式一般为HH:MM:SS,其中HH表示小时,MM表示分,SS表示秒。
在MySQL中,可以使用以下3种格式指定TIME类型的值:
- 以’HHMMSS’字符串或者HHMMSS数学格式表示。
- 以’HH:MM:SS’字符串格式表示。
- 使用CURRENT_TIME或NOW()输入当前系统时间。
2.4,DATETIME类型
DATETIME类型在所有的日期时间类型中占用的存储空间最大,总共需要 8 个字节的存储空间,用来表示日期和时间,它的显示形式为’YYYY-MM-DD HH:MM:SS’。
在MySQL中,可以使用以下4种格式指定DATETIME类型的值:
- 以’YYYY-MM-DD HH:MM:SS’或’YYYYMMDDHHMMSS’字符串格式表示的日期和时间,取值范围为’1000-01-01 00:00:00’~‘9999-12-31-23-59-59’。
- 以’YY-MM-DD HH:MM:SS’或’YYMMDDHHMMSS’字符串格式表示的日期和时间,
- 以YYYYMMDDHHMMSS或YYMMDDHHMMSS数字格式表示的日期和时间,
- 使用NOW()来输入当前系统的日期和时间。
2.5,TIMESTAMP类型
TIMESTAMP(时间戳)类型用于表示日期和时间,需要4个字节的存储空间,它的显示形式与DATETIME类型的相同,但取值范围比DATETIME类型的小。
TIMESTAMP类型与DATETIME类型的不同形式:
- 使用CURRENT_TIMESTAMP来输入系统当前的日期和时间。
- 无任何输入,或输入NULL时,实际保存的是系统当前日期和时间。
知识点:
- 在MySQL中,TIMESTAMP字段默认情况下会自动设置NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP属性。- NOT NULL表示非空约束,该字段不允许为空。- DEFAULT表示默认约束,当字段无任何输入时,自动设置某个值作为默认值。 - 此处设为CURRENT_TIMESTAMP表示使用系统当前日期和时间作为默认值。- ON UPDATE用于当一条记录中的其它字段被修改时,自动更改该字段为某个值。 - 此处设为CURRENT_TIMESTAMP表示每次修改时保存修改时的系统日期和时间。- 若为TIMESTAMP字段手动设置DEFAULT属性时,该字段不会自动设置ON UPDATE 属性。
- 存储数据的时候需要对当前时间所在的时区进行转换,查询数据的时候再将时间转换回当前的时区。因此,使用TIMESTAMP存储的同一个时间值,在不同的时区查询时会显示不同的时间。
3,字符串类型
MySQL中的字符串类型分别为CHAR,VARHAR,TEXT等多种类型,不同数据类型具有不同的特点。
数据类型类型说明CHAR固定长度字符串VARCHAR可变长度字符串TEXT大文本数据ENUM枚举类型SET字符串类型BINARY固定长度的二进制数据VARBINARY可变长度是二进制数据BLOB二进制大对象
3.1,CHAR和VARCHAR类型
CHAR和VARCHAR类型都是用来保存字符串数据,两者不同的是,VARCHAR可以存储可变长度的字符串数据。
字符串类型特点长度长度范围占用的存储空间CHAR(M)固定长度M0<=M<=255M个字节VARCHAR(M)可变长度M0<=M<=65535(实际长度 + 1) 个字节
在MySQL中,定义CHAR和VARCHAR类型的语法格式为:
CHAR(M)
VARCHAR(M)
知识点:
- CHAR(M) 类型一般需要预先定义字符串长度。如果不指定(M),则表示长度默认是1个字符。
- 如果保存数据的实际长度比CHAR类型声明的长度小,则会在右侧填充空格以达到指定的长度。当MySQL检索CHAR类型的数据时,CHAR类型的字段会去除尾部的空格。
- 定义CHAR类型字段时,声明的字段长度即为CHAR类型字段所占的存储空间的字节数。
- VARCHAR(M) 定义时, 必须指定长度M,否则就会报错。
- 检索VARCHAR类型的字段数据时,会保留数据尾部的空格。VARCHAR类型的字段所占用的存储空间为字符串实际长度加1个字节。
扩展1:CHAR(4)和VARCHAR(4)存储需求对比:
插入值CHAR(4)存储需求VARCHAR(4)存储需求‘a’4字节1字节‘ab’4字节3字节‘abc’4字节4字节‘abcd’4字节5字节
- 对于CHAR(4)无论插入值的长度是多少,所占存储空间就为4字节,而VARCHAR(4)占用的字节数为实际长度加1。
扩展2:CHAR(M)和VARCHAR(M)的特点及应用环境
类型特点空间时间使用场景CHAR(M)固定长度浪费存储空间效率高存储不大,速度要求高VARCHAR(M)可变长度节省存储空间效率低非CHAR情况
- 情况1:存储较短的字段数据信息使用char,若使用varchar,还需要额外1个字节来存储信息长度,造成空间存储浪费。
- 情况2:储存固定的字段数据信息使用char,因字段长固定,varchar的可变长的特性对存储空间没有效果了,还需要额外1个字节来存储信息长度。
- 情况3:频繁改变的column使用char,因varchar每次存储都要有额外的计算,从而完成得到长度等工作,如果一个非常频繁改变的column操作,那就要花费很多时间和空间来用于计算,而这些对于char来说是不需要的。
注意事项:
- 在选择数据类型时,若一个数据将来可能会参与数学运算时,推荐使用整数,浮点数,定点数类型;若只是为了显示,则推荐使用字符串类型。
- 表的主键推荐使用整数类型,因为与字符串类型相比,整数类型的处理效率更高,查询速度更快。
- 当插入的值的数据类型与字段的数据类型不一致时,或使用ALTER TABLE修改字段的数据类型时,MySQL会尝试尽可能的将现有的值转换为新类型。例如,字符串"123"与数字123可以相互转换,浮点数1.5转换为整数时,会进行四舍五入,转换为整数2。
3.2,TEXT类型
TEXT类型用于保存大文本数据,例如,文章内容,评论等比较长的文本。
数据类型存储范围存储空间占用量特点TINYTEXT(tinytext)02^8-1文本长度+2小文本,可变长度TEXT(text)02^16-1文本长度+2文本,可变长度MEDIUMTEXT(mediumtext)02^24-1文本长度+3中等文本,可变长度LONGTEXT(longtext)02^32-1文本长度+4大文本,可变长度
- 在向TEXT类型的字段保存和查询数据时,系统自动按照实际长度存储,不需要预先定义长度。这一点和VARCHAR类型相同。
- 由于实际存储的长度不确定,MySQL不允许TEXT类型的字段做主键,只可使用VARCHAR和CHAR字段类型。
- TEXT文本类型可以存储较多的文本,但搜索速度较慢,所以不是特别大的文本,可选择使用VARCHAR和CHAR字段类型代替。
- 若一个表被频繁使用,这个表中不建议存在TEXT类型的字段。因TEXT和BLOB类型的数据删除后容易导致空洞,使文件碎片比较多。
3.3,ENUM类型
ENUM类型又称为枚举类型,其定义格式为:
ENUM('值1','值2','值3','值4','值5',....,'值n')
- ENUM类型的取值范围需要在定义字段时进行指定。
- 设置字段值时,ENUM类型只允许从成员中选取单个值,不能一次选取多个值。
- 其所需要的存储空间由定义ENUM类型时指定的成员个数决定。- 当ENUM类型包含1
255个成员时,需要1个字节的存储空间- 当ENUM类型包含25665535个成员时,需要2个字节的存储空间- ENUM类型的成员个数的上限为65535个
为了能够更好的理解ENUM类型以及其注意事项,实例如下:
3.4,SET类型
SET类型用于保存字符串对象,其定义格式与ENUM类型相似。
SET('值1','值2','值3','值4','值5',....,'值n')
- 其所需要的存储空间由定SET类型时指定的成员个数决定。SET类型包含的成员数存储空间1
81个字节9162个字节17243个字节25324个字节33~648个字节 - SET类型在存储数据时成员个数越多,其占用的存储空间越大。
- SET类型在选取成员时,与ENUM类型不同,其可以一次选择多个成员。
为了能够更好的理解SET类型以及其注意事项,实例如下:
3.5,BINARY和VARBINARY类型
BINARY和VARBINARY类型类似于CHAR和VARCHAR,不同的是,它们所表示的是二进制数据。
类型特点长度长度范围占用的存储空间BINARY(M)固定长度M0<=M<=255M个字节VARBINARY(M)可变长度M0<=M<=65535(M+ 1) 个字节
BINARY和VARBINARY类型的定义形式:
BINARY(M)
VARBINARY(M)
3.6,BLOB类型
BLOB类型用于保存数据量比较大的二进制数据,如图片,PDF文档等。
数据类型存储范围占用空间TINYBLOB02^8 -1字节len+1个字节BLOB02^16 -1字节(相当于64KB)len+2个字节MEDIUMBLOB02^24 -1字节(相当于16MB)len+3个字节LONGBLOB02^32 -1字节(相当于4GB)len+4个字节
注意:
- BLOB类型与TEXT类型相似,但BLOB类型数据是根据二进制编码进行比较和排序,而TEXT类型数据是根据文本模式进行比较和排序。
4,JSON数据类型
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式 ,简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。它易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在网络或者程序之间轻松地传递这个字符串,并在需要的时候将它还原为各编程语言所支持的数据格式。
在MySQL 5.7中,就已经支持JSON数据类型。在MySQL中,JSON类型常见的表示方式有2种,分别为JSON数组和JSON对象。
#JSON数组
['abc',10,null,true]
#JSON对象
{"k1":"value","k2":10}
知识点:
- JSON数组中保存的数据可以是任意类型的,如数字型,字符串型,布尔型,null …
- JSON数组使用“["和”]“符号实现,多个值之间用使用逗号相隔;JSON对象使用”{“和”}“符号实现,保存的是一组键值对,形式为属性名:对应的属性值。
- JSON数据类型与字符串类型相比,JSON数据类型具有自动验证格式,优化存储格式的优点。
- JSON数据类型所需的空间和LONGBLOB或LONGTEXT相同,且不能有默认值。
为了能够更好的理解JSON数据类型以及其注意事项,实例如下:
结语
这就是本期博客的全部内容啦,想必大家已经对MySQL中的基本数据类型有了全新地认识和理解吧,如果有什么其他的问题无法自己解决,可以在评论区留言哦!
最后,如果你觉得这篇文章写的还不错的话或者有所收获的话,麻烦小伙伴们动动你们的小手,给个三连呗(点赞👍,评论✍,收藏📖),多多支持一下!各位的支持是我最大的动力,后期不断更新优质的内容来帮助大家,一起进步。那我们下期见!
版权归原作者 小杨MiManchi 所有, 如有侵权,请联系我们删除。