SQL 基础教程
SQL 连接
SQL 高级教程
SQL 参考资料

MySQL 数据类型

以下部分描述了 MySQL 支持的数据类型。

MySQL 数据类型

MySQL 支持三类数据类型:字符串数值日期/时间数据类型。

字符串数据类型

字符串数据类型通常用于存储名称、地址、描述或任何包含字母和数字的值,包括二进制数据,如图像或音频文件。

CHAR 和 VARCHAR 类型

CHAR 数据类型允许您存储最大长度为 255 个字符的固定长度字符串。 而 VARCHAR 数据类型允许您存储最大大小为 65,535 个字符的可变长度字符串(在 MySQL 5.0.3 之前限制为 255 个字符)。

CHARVARCHAR 数据类型的声明长度表示要存储的最大字符数。 例如,CHAR(5) 最多可容纳 5 个字符。

CHARVARCHAR 数据类型之间的主要区别在于它们存储数据的方式。 当值存储在 CHAR 列中时,它们会用空格右填充到指定的长度,但在 VARCHAR 列中的值在存储时不会被填充。 这意味着如果您将值"ab"存储在 CHAR(4) 列中,则该值将存储为 'ab  ',而相同的值将作为 'ab' 存储在 VARCHAR(4) 列中。

提示: 使用 CHAR 数据类型来存储具有固定长度的值,例如地区代码。 对于具有可变长度的值,例如名称或标题,请使用 VARCHAR 来节省空间。

注意: VARCHAR 的有效最大长度取决于最大行大小(65,535 字节,所有列共享)和使用的字符集。

BINARY 和 VARBINARY 类型

BINARYVARBINARY 类型与 CHARVARCHAR 类似,不同之处在于它们包含二进制字符串而不是非二进制字符串。 BINARYVARBINARY 的允许最大长度与 CHARVARCHAR 相同,只是 BINARYVARBINARY 的长度是字节长度而不是字符长度。

TEXT 和 BLOB 类型

TEXTBLOB 数据类型专门用于保存大型数据集。 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 还支持整数类型 TINYINTMEDIUMINTBIGINT 作为 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

数值数据类型具有附加属性 SIGNEDUNSIGNED。 默认情况下,数值数据类型为 SIGNED,它们的范围从负值到正值。 将 UNSIGNED 属性添加到数字列不允许负值,并以最小值从零开始而不是负数的方式向上移动范围。

DECIMAL, NUMERIC 类型

DECIMALNUMERIC 数据类型用于存储精确的数值。 这些数据类型也称为"定点"或"精确值"类型,通常在需要保持精确精度时使用,例如存储产品价格等货币数据。 在 MySQL 中,NUMERIC 实现为 DECIMAL

在声明 DECIMALNUMERIC 列时,可以指定精度和小数位数,如 DECIMAL(P,S)NUMERIC(P,S),其中 P 是精度,S 是小数位数。 精度指定列中可以存储的最大位数(包括小数点后的位数),而小数位数表示小数点后可以存储的位数。 例如,price DECIMAL(6,2) 列可以存储任何具有 6 位数字和 2 位小数的值,即在 -9999.99 to 9999.99 的范围内。

FLOAT,DOUBLE 类型

FLOATDOUBLE 类型表示近似数值数据值。 这就是为什么这些数据类型也被称为"浮点"或"近似值"类型

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 类型

DATETIMETIMESTAMP 数据类型用于以 '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。

此外,TIMESTAMPDATETIME 具有特殊的自动初始化和自动更新属性,但这些属性在 MySQL 5.6.5 之前的 DATETIMEM 中不可用。

注意: MySQL 将 TIMESTAMP 值从当前时区转换为 UTC 进行存储,并从 UTC 转换回当前时区进行检索。

年份类型

YEAR 数据类型用于以 YYYY 格式存储四位数的年份值。

它可以被声明为 YEARYEAR(4)YEAR 值支持的范围是 1901 到 2155。无效的 YEAR 值将转换为 0000。

注意: 旧版本的 MySQL 也允许使用 YEAR(2) 存储两位数的年份值,但现在已弃用,并且在 MySQL 5.7.5 中删除了对它的支持。

Advertisements