MYSQL数据类型
- 1 整数类型
- 2 浮点数类型和定点数类型
- 3 日期与时间类型
- 4 文本字符串类型
- 5 二进制字符串类型
- 6 数据类型的选择
表是由多列字段组成,每一个字段会有不同的数据类型,不同的数据类型决定了字段包含的数据内容。不同的数据类型也决定了mysql在使用他们的时候的方式。
1 整数类型
数据型数据类型主要用来存储数字,不同的数据类型提供不同的取值范围,可以存储的值的范围越大,所需要的存储空间也会越大。
1. TINYINT:
用于存储范围在 -128 到 127 之间的整数。如果使用 UNSIGNED 关键字,则范围变为 0 到 255,存储需求为1字节。
2. SMALLINT:
用于存储范围在 -32,768 到 32,767 之间的整数。如果使用 UNSIGNED 关键字,则范围变为 0 到 65,535,存储需求为2字节。
3. MEDIUMINT:
用于存储范围在 -8,388,608 到 8,388,607 之间的整数。如果使用 UNSIGNED 关键字,则范围变为 0 到 16,777,215,存储需求为3字节。
4. INT 或 INTEGER:
用于存储范围在 -2,147,483,648 到 2,147,483,647 之间的整数。如果使用 UNSIGNED 关键字,则范围变为 0 到 4,294,967,295,存储需求为4字节。
5. BIGINT:
用于存储范围在 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 之间的整数。如果使用 UNSIGNED 关键字,则范围变为 0 到 18,446,744,073,709,551,615,存储需求为8字节。
2 浮点数类型和定点数类型
MySQL支持两种用于存储小数的数据类型,即浮点数类型和定点数类型。
1. 浮点数类型
包括FLOAT和DOUBLE,这两种类型都可以存储较大或较小的值,因为它们使用科学记数法表示数值。
FLOAT和DOUBLE的区别在于精度和存储空间大小。FLOAT类型精度为单精度,即4个字节,而DOUBLE类型精度为双精度,即8个字节。
FLOAT和DOUBLE类型的取值范围如下:
FLOAT类型的取值范围为-3.4028235E+38到3.4028235E+38,精度为单精度(4字节)。
DOUBLE类型的取值范围为-1.7976931348623157E+308到1.7976931348623157E+308,精度为双精度(8字节)。
- 定点数类型
定点数只有一种类型 DECIMAL。不同于FLOAT和DOUBLE,DECIMAL 实际上是以串的方式存放的,可能取值的范围和DOUBLE类型一样,但是有效的取值范围由精度和标度来确定。
它的存储空间是由精度值来决定的,占用 精度+2 字节。
例如,DECIMAL(8,2)可以存储-999999.99到999999.99之间的值,因为它使用8个数字位,其中2个数字是小数点后的位数。
FLOAT和DOUBLE在不指定精度的前提下,默认会按照实际的精度,DECIMAL如不指定精度,默认为(10,0)。
3 日期与时间类型
MySQL支持多种日期和时间类型,包括日期类型、时间类型、日期时间类型和时间戳类型。
- 日期类型:YEAR
单字节类型,用于表示年,在存储时只需要1字节,可以使用各种格式指定YEAR值。
1)4位字符或者4位数字格式表示的year,范围在 1901~2155,输入格式为’YYYY’或者 YYYY。
2)2位字符串表示的year,范围在00~99,其中00 ~ 69 和70 ~ 99的范围分别会被转换为2000 ~ 2069 和 1970 ~ 1999 的范围。
0 和 00 的范围相同,插入超过取值范围的值会被转换为 2000.
3)2位数字表示的year,范围在1 ~ 99. 1~ 69 和 70 ~ 99 会被转换为2001 ~ 2069 和 1970 ~ 1999 的范围。
注意,在这里 0 值将会装换为 0000 而不是 2000。
- 时间类型:TIME
time类型用在只需要时间信息的值,存储室后需要3字节,格式为’HH:MM:SS’ 从前至后分别表示小时,分钟,秒三个时间单位。取值范围为 -838:59:59 ~ 838:59:59,范围如此大的原因在于,不仅仅可以用于表示一天的时间,和可以用于表示过去的时间或者两个时间的时间间隔(可以为负数)。
1)‘D HH:MM:SS’ 格式的字符串,可以使用如下任何一种非严格的语法,‘HH:MM:SS’ ,‘HH:MM’ ,‘D HH:MM’ ,‘D HH’ ,‘SS’。 D在这里可以表示日,取值为0 ~ 34之间的值,插入数据库时,转换为小时保存,格式为 D*24 + HH。
2)‘HHMMSS’ 格式,没有间隔的字符串或者数值,有意义的数值,如 101012 则变为 10:10:12,不合法数据 959897,任意部分取值范围不合法,存储室变为 00:00:00.
- 日期时间类型:DATE
用在仅需日期值时,没有时间部分,存储需要 3 字节。日期格式为 ‘YYYY-MM-DD’。从前至后分别表示年,月,日三个时间单位。可使用字符或者数字类型进行数据插入,只要符合日期格式即可。
1)以’YYYY-MM-DD’ 或者’YYYYMMDD’ 的字符串表示的日期为 1000-01-01 ~ 9999-12-3 。 ‘2012-12-11’ 或者 ‘20121211’ 均为 2012-12-11.
2)以’YY-MM-DD’ 或者’YYMMDD’ 的字符串或者数据值表示的日期,YY表示的范围,参考 YEAR数据类型的范围。
3)使用current_date() 或者 NOW() ,插入当前系统日期。
- 日期时间类型:DATETIME
表示同时包含日期和时间信息的值,存储室需要8字节。‘YYYY-MM-DD HH:MM:SS’ 从前至后分别表示年,月,日 小时,分钟,秒。可使用字符或者数字类型进行数据插入,只要符合日期格式即可。
1)‘YYYY-MM-DD HH:MM:SS’ 或者 ‘YYYYMMDDHHMMSS’ 字符串格式表示的值,取值范围为 1000-01-01 00:00:00~ 9999-12-3 23:59:59。
2)‘YY-MM-DD HH:MM:SS’ 或者 ‘YYMMDDHHMMSS’ 字符串格式表示的日期,YY表示的范围,参考 YEAR数据类型的范围。
3) ‘YYYYMMDDHHMMSS’ 或者’YYMMDDHHMMSS’ 表示的日期和时间,在合理取值单位内,进行日期插入,如20230421131512 为 2023-04-21 13:15:12 , 980512234511 为 1998-01-12 23:45:11。
- 日期时间类型:TIMESTAMP
该类型显示的格式和DATETIME 相同,显示宽度固定在19个字节,日期格式为’YYYY-MM-DD HH:MM:SS’ ,取值范围小于 datatime,范围为 1970:-01-01 00:00:01 ~ 2038-01-19 03:14:07 UTC,UTC为世界标准时间,因此插入数据要在合法的取值范围内。
4 文本字符串类型
字符串类型用来存储字符串数据,可以存储字符串数之外,还可以存储其他数据,如图片和声音等,mysql中文本字符串指定的是CHAR,VARCHAR,TEXT,ENUM,SET。
- CHAR 和 VARCHAR
CHAR(M) 为固定长度字符串,定义时指定长度,保存是在右侧填充空格,已达到执行的字符长度,M为列长度,范围是0 ~ 255 个字符。
VARCHAR(M) 是长度可变的字符串,M表示最大列长度,范围是0 ~ 65535。VARCHAR的实际长度是由最长的行的大小和使用的字符集来决定的,实际占用的空间为字符串的实际长度+1。
- TEXT
TEXT列保存非二进制字符串,保存或者查询TEXT列的值的时候,不删除尾部空格。类型分为4种,
TINYTEXT:最多存储 2^8 - 1(即255)个字符,占用空间为 1 个字节。
TEXT:最多存储 2^16 - 1(即65,535)个字符,占用空间为 2 个字节。
MEDIUMTEXT:最多存储 2^24 - 1(即16,777,215)个字符,占用空间为 3 个字节。
LONGTEXT:最多存储 2^32 - 1(即4,294,967,295)个字符,占用空间为 4 个字节。
- ENUM
存储枚举值的数据类型,用于存储固定的、有限的可能值集合。在创建表时指定ENUM类型的列时,需要用到ENUM关键字,并且需要指定该列允许的枚举值。
ENUM类型的语法格式为:
ENUM('value1', 'value2', 'value3', ...)
其中,value1、value2、value3等就是该ENUM类型所能存储的枚举值,每个枚举值用单引号括起来,用逗号隔开。
- SET类型
一种存储多个选项的数据类型,用于存储一组固定的、有限的可能选项集合。在创建表时指定SET类型的列时,需要用到SET关键字,并且需要指定该列允许的选项集合。
SET类型的语法格式为:
SET('option1', 'option2', 'option3', ...)
其中,option1、option2、option3等就是该SET类型所能存储的选项,每个选项用单引号括起来,用逗号隔开。
5 二进制字符串类型
二进制字符串类型是MySQL中一种存储二进制数据的数据类型,用于存储一些可能存在二进制数据的数据,如图片、音频、视频等。
- BIT
BIT类型是MySQL中一种存储位数据(二进制位)的数据类型。BIT类型可以存储零个或多个位,其长度由列声明中指定的位数决定。BIT类型可以存储布尔值或者位数据的组合,如二进制数或者旗帜(flag)等。
在MySQL中,BIT类型的长度可以是1到64位,如果不指定长度,MySQL会默认为1。与其他类型不同的是,在顺序排列中,BIT类型中的位是从右到左被编号的,也就是从低位到高位。在创建表时可以使用BIT类型。
- BINARY 和 VARBINARY
BINARY和VARBINARY都是MySQL中用来存储二进制数据的数据类型。
BINARY类型是一种固定长度的数据类型,它指定了一个固定的长度作为该列所能存储的二进制数据长度,如果插入的数据长度超过了指定的长度则会被截断。因为它是固定长度的,所以BINARY类型会占用比VARBINARY更多的存储空间。
VARBINARY类型是一种可变长度的二进制数据类型,它可以存储任意长度的二进制数据。因为它是可变的,所以VARBINARY类型只会占用实际数据长度的存储空间。
需要注意的是,虽然BINARY类型和VARBINARY类型都可以存储二进制数据,但它们的使用场景不太相同。BINARY类型适用于固定长度的二进制数据,例如存储MD5值等固定长度的字符串或哈希值;VARBINARY类型适用于可变长度的二进制数据,例如存储文件、视频、图片等任意长度的二进制数据。
- BLOB
BLOB是MySQL中一种二进制大型对象数据类型,用于存储大型二进制数据,例如图像、音频、视频等文件。BLOB类型可以存储零个或多个字节数,而且没有数据类型的最大长度。
在MySQL中,有4种类型的BLOB:
TINYBLOB:最大长度为255字节。
BLOB:最大长度为65,535字节。
MEDIUMBLOB:最大长度为16,777,215字节。
LONGBLOB:最大长度为4,294,967,295字节。
6 数据类型的选择
数据类型的选择要根据实际的需求来确定。以下是一些常见的数据类型和使用场景:
INT: 适用于创建表中的ID列、自然数列和计数器列,可以存储范围从-2147483648到2147483647的整数。
BIGINT: 适用于存储大整数,可以存储范围从-9223372036854775808到9223372036854775807的整数。
FLOAT: 适用于存储较小的浮点数,可以存储6个小数位的浮点数。
DOUBLE: 适用于存储更复杂的浮点数,可以存储15个小数位的浮点数。
DECIMAL: 适用于存储精确的小数,可以存储定点数,支持可变的小数位。
VARCHAR: 适用于存储可变长度的字符,可以存储最大65535个字符。
TEXT: 适用于存储不可预知长度的字符,可以存储最大65535个字符。
ENUM: 适用于存储预定的一组值,可以根据需要创建和使用。
DATE: 适用于存储日期,存储范围从1000-01-01到9999-12-31。
TIME: 适用于存储时间,可以存储小时、分钟、秒和毫秒。
在选择数据类型时,需要考虑存储的数据类型和大小,还要考虑查询的效率和可扩展性。因此,如果数据类型不确定,请在设计表时选择较小的数据类型,并在需要时扩展它们。另外,数据类型的选择也要考虑要支持的字符集和排序规则,以及数据的一致性和完整性,并遵循最佳实践。