Skip to main content

数据类型

MarshioAbout 5 minMySQL

MySQL中定义的数据字段的类型对优化数据库非常重要。

MySQL支持多种数据类型,大致可分为三种

  • 数值
  • 日期
  • 字符串

数值型

MySQL支持所有标准SQL数值数据类型。 严格数值数据类型:INTEGER、SMALLINT、DECIMAL、NUMERIC 近似数值数据类型:FLOAT、REAL、DOUBLE PRECISION 也支持整数类型 TINYINT、MEDIUMINT 、 BIGINT

1 Byte = 1 byte = 1B = 1字节 = 8 bit = 8位

1KB = 1024B

1 字符 = 多个字节

在UTF8中,一个英文字符占一个字节,一个汉字占三个字节。

类型大小范围(有符号)范围(无符号)用途
TINYINT1 Bytes1字节(-128,127)(0,255)
SMALLINT2 Bytes2字节(-32 768,32 767)(0,65 535)
MEDIUMINT3 Bytes3字节(-8 388 608,8 388 607)(0,16 777 215)
INT或INTEGER4 Bytes4字节(-2 147 483 648,2 147 483 647)(0,4 294 967 295)
BIGINT8 Bytes8字节(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)
FLOAT4 Bytes4字节(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466 E+38)
DOUBLE8 Bytes8字节(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)
DECIMAL对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2依赖于M和D的值依赖于M和D的值小数值

日期型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。 每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。 TIMESTAMP类型有专有的自动更新特性,将在后面描述。

类型大小 ( bytes)范围格式用途
DATE31000-01-01/9999-12-31YYYY-MM-DD日期值
TIME3'-838:59:59'/'838:59:59'HH:MM:SS时间值或持续时间
YEAR11901/2155YYYY年份值
DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值
TIMESTAMP41970-01-01 00:00:00结束时间是第2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07YYYYMMDD HHMMSS混合日期和时间值,时间戳

DATE

DATE类型不支持函数化的默认初始值,其默认值必须是一个常量。 DATETIME,支持NOW()、CURRENT_TIMESTAMP

create table db_time(
`date_init_1` date DEFAULT CURRENT_DATE,//1
`date_init_2` date DEFAULT CURRENT_TIME,
`date_init_3` date DEFAULT CURRENT_TIMESTAMP,
`datetime_init_1` datetime DEFAULT CURRENT_DATE,
`datetime_init_2` datetime DEFAULT CURRENT_TIME,
`datetime_init_2` datetime DEFAULT CURRENT_TIMESTAMP,//1 等价于使用 now()
 # 在使用timestamp时,默认值已经设为了CURRENT_TIMESTAMP
`timestamp_init_1` timestamp DEFAULT CURRENT_DATE,
`timestamp_init_2` timestamp DEFAULT CURRENT_TIME,
`timestamp_init_3` timestamp DEFAULT CURRENT_TIMESTAMP;/

字符串

也称文本类,无特殊说明存储的都是字符.

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。

char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。

CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。

BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。

有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。

数据类型描述
CHAR(size)保存固定长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的长度。最多 255 个字符。
VARCHAR(size)保存可变长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的最大长度。最多 255 个字符。注释:如果值的长度大于 255,则被转换为 TEXT 类型。
TINYTEXT存放最大长度为 255 个字符的字符串。
TEXT存放最大长度为 65,535 个字符的字符串。
BLOB用于 BLOBs (Binary Large OBjects)。存放最多 65,535 字节的数据。
MEDIUMTEXT存放最大长度为 16,777,215 个字符的字符串。
MEDIUMBLOB用于 BLOBs (Binary Large OBjects)。存放最多 16,777,215 字节的数据。
LONGTEXT存放最大长度为 4,294,967,295 个字符的字符串。
LONGBLOB用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字节的数据。
ENUM(x,y,z,etc.)允许你输入可能值的列表。可以在 ENUM 列表中列出最大 65535 个值。如果列表中不存在插入的值,则插入空值。注释:这些值是按照你输入的顺序存储的。可以按照此格式输入可能的值:ENUM('X','Y','Z')
SET与 ENUM 类似,SET 最多只能包含 64 个列表项,不过 SET 可存储一个以上的值。

NULL

数据库对于 null有额外的处理方式,因为一般的命令对NULL可能不在生效。

  • IS NULL:当列值为 null时,会返回true
  • IS NOT NULL:当列值不为 null时,会返回true
  • <=>:当比较的两个值相等或都为 null时,返回true