MySQL 数据类型
以下部分描述了 MySQL 支持的数据类型。
MySQL 数据类型
MySQL 支持三类数据类型:字符串、数值 和 日期/时间数据类型。
字符串数据类型
字符串数据类型通常用于存储名称、地址、描述或任何包含字母和数字的值,包括二进制数据,如图像或音频文件。
CHAR 和 VARCHAR 类型
CHAR
数据类型允许您存储最大长度为 255 个字符的固定长度字符串。 而 VARCHAR
数据类型允许您存储最大大小为 65,535 个字符的可变长度字符串(在 MySQL 5.0.3 之前限制为 255 个字符)。
CHAR
和 VARCHAR
数据类型的声明长度表示要存储的最大字符数。 例如,CHAR(5)
最多可容纳 5 个字符。
CHAR
和 VARCHAR
数据类型之间的主要区别在于它们存储数据的方式。 当值存储在 CHAR
列中时,它们会用空格右填充到指定的长度,但在 VARCHAR
列中的值在存储时不会被填充。 这意味着如果您将值"ab"存储在 CHAR(4)
列中,则该值将存储为 'ab ',而相同的值将作为 'ab' 存储在 VARCHAR(4)
列中。
提示: 使用 CHAR
数据类型来存储具有固定长度的值,例如地区代码。 对于具有可变长度的值,例如名称或标题,请使用 VARCHAR
来节省空间。
注意: VARCHAR
的有效最大长度取决于最大行大小(65,535 字节,所有列共享)和使用的字符集。
BINARY 和 VARBINARY 类型
BINARY
和 VARBINARY
类型与 CHAR
和 VARCHAR
类似,不同之处在于它们包含二进制字符串而不是非二进制字符串。 BINARY
和 VARBINARY
的允许最大长度与 CHAR
和 VARCHAR
相同,只是 BINARY
和 VARBINARY
的长度是字节长度而不是字符长度。
TEXT 和 BLOB 类型
TEXT
和 BLOB
数据类型专门用于保存大型数据集。 TEXT
数据类型用于存储长字符串,如描述、文章评论等。
BLOB
是一个二进制大对象,可以保存可变数量的数据。 当您需要在数据库中存储二进制媒体文件(例如图像或音频文件)时,它特别有用。
四种 BLOB
类型是 TINYBLOB
, BLOB
, MEDIUMBLOB
, 和 LONGBLOB
。 这些仅在它们可以保存的值的最大长度上有所不同。 同样,四种TEXT
类型是TINYTEXT
, TEXT
, MEDIUMTEXT
, 和 LONGTEXT
。 这些对应于四种 BLOB
类型,并且具有相同的最大长度和存储要求。
下表列出了成对出现的 MySQL 字符串数据类型。 最大长度以字节为单位,无论类型是二进制还是非二进制。
二进制数据类型 | 非二进制数据类型 | 最大长度 |
---|---|---|
BINARY |
CHAR |
255 |
VARBINARY |
VARCHAR |
65,535 |
TINYBLOB |
TINYTEXT |
255 |
BLOB |
TEXT |
65,535 |
MEDIUMBLOB |
MEDIUMTEXT |
16,777,215 |
LONGBLOB |
LONGTEXT |
4,294,967,295 |
注意:在非二进制字符串数据类型的情况下,列长度值通常称为字符数而不是字节数。 这意味着包含多字节字符的字符串的最大字符数更少。
ENUM 类型
ENUM
数据类型允许您指定可以存储在列中的可能值列表。 例如,指定为 gender ENUM('male', 'female') NOT NULL
的列可以具有以下任何值:''、'male' 或 'female'。 您最多可以在 ENUM
列表中指定 65,535 个不同的值。 如果将无效值插入 ENUM
列,即允许值列表中不存在的字符串,则将插入空字符串。
SET 类型
SET
数据类型允许您指定要插入列中的值列表,如 ENUM
。 但是,与只允许您选择一个值的 ENUM
数据类型不同,SET
数据类型允许您从指定值列表中选择多个值。
例如,指定为 option SET('one', 'two') NOT NULL
的列可以存储以下任何值:''、'one'、'two' 或 'one,two'。 用逗号分隔的多个值 (,
)。 对于 SET
数据类型,您最多可以指定 64 个不同的值。
数值数据类型
数值数据类型通常用于存储价格、工资等数据。
INTEGER、INT、SMALLINT、TINYINT、MEDIUMINT、BIGINT 类型
MySQL 支持 SQL 标准整数类型 INTEGER
(或 INT
)和 SMALLINT
。 MySQL 还支持整数类型 TINYINT
、MEDIUMINT
和 BIGINT
作为 SQL 标准的扩展。 下表显示了每种整数类型的范围。
数据类型 | 范围(有符号) | 范围(无符号) |
---|---|---|
TINYINT |
-128 to 127 |
0 to 255 |
SMALLINT |
-32768 to 32767 |
0 to 65535 |
MEDIUMINT |
-8388608 to 8388607 |
0 to 16777215 |
INT |
-2147483648 to 2147483647 |
0 to 4294967295 |
BIGINT |
-9223372036854775808 to 9223372036854775807 |
0 to 18446744073709551615 |
数值数据类型具有附加属性 SIGNED
和 UNSIGNED
。 默认情况下,数值数据类型为 SIGNED
,它们的范围从负值到正值。 将 UNSIGNED
属性添加到数字列不允许负值,并以最小值从零开始而不是负数的方式向上移动范围。
DECIMAL, NUMERIC 类型
DECIMAL
和 NUMERIC
数据类型用于存储精确的数值。 这些数据类型也称为"定点"或"精确值"类型,通常在需要保持精确精度时使用,例如存储产品价格等货币数据。 在 MySQL 中,NUMERIC
实现为 DECIMAL
。
在声明 DECIMAL
或 NUMERIC
列时,可以指定精度和小数位数,如 DECIMAL(P,S)
或 NUMERIC(P,S)
,其中 P 是精度,S 是小数位数。 精度指定列中可以存储的最大位数(包括小数点后的位数),而小数位数表示小数点后可以存储的位数。 例如,price DECIMAL(6,2)
列可以存储任何具有 6 位数字和 2 位小数的值,即在 -9999.99
to 9999.99
的范围内。
FLOAT,DOUBLE 类型
FLOAT
和 DOUBLE
类型表示近似数值数据值。 这就是为什么这些数据类型也被称为"浮点"或"近似值"类型
MySQL 支持语法:FLOAT(M,D)
或 DOUBLE PRECISION(M,D)
。 这里,(M,D) 表示总共最多可以存储M 位的值,其中D 位可能在小数点后。 例如,定义为 FLOAT(7,3)
的列在显示时看起来像 -9999.999。 MySQL 在存储值时会进行舍入,因此如果将 9999.0009 插入 FLOAT(7,3)
列,则近似结果为 9999.001。
注意:比较浮点值可能会导致问题,因为它们是近似值,而不是存储为精确值。 因此,要存储可用于比较的值,例如价格、薪水等,请改用 DECIMAL
数据类型。
日期和时间数据类型
日期和时间数据类型通常用于存储数据,如出生日期、招聘日期、在表内创建或更新记录的日期和时间等。
日期类型
DATE
数据类型用于存储日期。 MySQL 以 'YYYY-MM-DD'
格式存储和检索 DATE
值,其中 YYYY
, MM
, 和 DD
是时间的年、月和日部分。 支持的范围是"1000-01-01"到"9999-12-31"。
时间类型
TIME
数据类型可用于存储时间或时间间隔。 MySQL 以 'HH:MM:SS'
格式存储和检索 TIME
值,其中 HH
, MM
, 和 SS
是时间的小时、分钟和秒部分(或大小时值的 'HHH:MM:SS'
格式)。 TIME
值支持的范围是"-838:59:59"到"838:59:59"。
小时部分可能很大,因为在 MySQL 中,TIME
类型不仅可以用于存储一天中的时间(必须小于 24 小时),还可以用于存储经过的时间或两者之间的时间间隔 事件(可能远大于 24 小时,甚至是负数)。
注意: 默认情况下,位于 TIME
范围之外但在其他方面有效的值将被剪裁到范围的最近端点。 例如,"860:00:00"转换为"838:59:59"。 无效的 TIME
值将转换为"00:00:00"。
DATETIME 和 TIMESTAMP 类型
DATETIME
和 TIMESTAMP
数据类型用于以 'YYYY-MM-DD HH:MM:SS'
格式存储组合的日期和时间值。 这些数据类型通常用于存储数据,例如发送订单的日期和时间、在表中创建或修改行的时间等。
两种数据类型在很多方面都相似,但也存在一些差异 — DATETIME
支持的范围是"1000-01-01 00:00:00"到"9999-12-31 23:59:59"。 而 TIMESTAMP
的范围为 '1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC。
此外,TIMESTAMP
和 DATETIME
具有特殊的自动初始化和自动更新属性,但这些属性在 MySQL 5.6.5 之前的 DATETIMEM
中不可用。
注意: MySQL 将 TIMESTAMP
值从当前时区转换为 UTC 进行存储,并从 UTC 转换回当前时区进行检索。
年份类型
YEAR
数据类型用于以 YYYY
格式存储四位数的年份值。
它可以被声明为 YEAR
或YEAR(4)
。 YEAR
值支持的范围是 1901 到 2155。无效的 YEAR
值将转换为 0000。
注意: 旧版本的 MySQL 也允许使用 YEAR(2)
存储两位数的年份值,但现在已弃用,并且在 MySQL 5.7.5 中删除了对它的支持。