MySQL(4-数据类型)
整数型
整数类型 | 字节数 | 无符号数的取值范围 | 有符号数的取值范围 |
---|---|---|---|
TINYINT | 1 | 0 ~ 255 | -128 ~ 127 |
SMALLINT | 2 | 0 ~ 65535 | -32768 ~ 32767 |
MEDIUMINT | 3 | 0 ~ 16777215 | -8388608 ~ 8388607 |
INT | 4 | 0 ~ 4294967295 | -2147483648 ~ 2147483647 |
INTEGER | 4 | 0 ~ 4294967295 | -2147483648 ~ 2147483647 |
BIGINT | 8 | 0 ~ 18446744073709551615 | -9223372036854775808 ~ 9223372036854775807 |
- TINYINT :一般用于枚举数据,比如系统设定取值范围很小且固定的场景。
- SMALLINT :可以用于较小范围的统计数据,比如统计工厂的固定资产库存数量等。
- MEDIUMINT :用于较大整数的计算,比如车站每日的客流量等。
- INT、INTEGER :取值范围足够大,一般情况下不用考虑超限问题,用得最多。比如商品编号。
- BIGINT :只有处理特别巨大的整数时才会用到。比如双十一的交易量、大型门户网站点击量、证券公司衍生产品持仓等。
浮点类型和定点型
类型 | 字节数 | 负数的取值范围 | 非负数的取值范围 |
---|---|---|---|
FLOAT | 4 | -3.402823466E+38 ~ -1.175494351E-38 | 0 和 1.175494351E-38 ~ 3.402823466E+38 |
DOUBLE | 8 | -1.7976931348623157E+308 ~ -2.2250738585072014E-308 | 0 和 2.2250738585072014E-308 ~ 1.7976931348623157E+308 |
DECIMAL(M, D) 或 DEC(M, D) | M+2 | 同 DOUBLE 型 | 同 DOUBLE 型 |
-
float 数值类型用于表示单精度浮点数值,而 double 数值类型用于表示双精度浮点数值,decimal 是定点型;
-
浮点型和定点型可以用类型名称后加(M,D)来表示,M 表示该值的总共长度,D 表示小数点后面的长度,M 和 D 又称为精度和标度
-
FLOAT 与 DOUBLE:(M, D)中 M = 整数位+小数位,D = 小数位。 D <= M <= 255,0 <= D <= 30。在不指定(M, D)时,默认会按照实际的精度(由实际的硬件和操作系统决定)来显示。如 float(7,4)的可显示为-999.9999,MySQL 保存值时进行四舍五入,如果插入 999.00009,则结果为 999.0001。
-
DECIMAL:M 是最大位数(精度),范围是 1 到 65,可不指定,默认值是 10。D 是小数点右边的位数(小数位),范围是 0 到 30,并且不能大于 M,可不指定,默认值是 0。
当设定的 float 或 double 的标度超过原来时,因为 float 或 double 本身所占用空间有限,所以超过本能存储位数时会以随机数字填充。
日期和时间类型
类型 | 字节数 | 取值范围 | 零值 |
---|---|---|---|
YEAR | 1 | 1901 ~ 2155 | 0000 |
DATE | 4 | 1000-01-01 ~ 9999-12-31 | 0000-00-00 |
TIME | 3 | -838:59:59 ~ 838:59:59 | 00:00:00 |
DATETIME | 8 | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 0000-00-00 00:00:00 |
TIMESTAMP | 4 | 1970-01-01 08:00:01 ~ 2038-01-19 11:14:07 | 00000000000000 |
常用的时间函数:
- CURDATE() :获得当前的 DATE, 可直接插入 DATE 类型中;
- NOW() :获得当前的 DATETIME, 可直接插入 DATETIME 和 TIMESTAMP 类型中;
- TIME() :获取参数给定时间串中的时分秒,可直接插入 TIME 类型中;
- YEAR() :获取参数给定时间串中的年份,可直接插入 YEAR 类型中;
- MONTH() 、DAY()、HOUR()、MINUTE()、SECOND() 获取参数给定时间串中的月、日、时、分、秒值;
datetime 和 timestamp 的区别
- timestamp 如果不给这个字段赋值或赋值为 null,则默认使用当前的系统时间来自动赋值(自动存储记录修改时间)
- timestamp 存储的时间范围比 datetime 要小很多,只能存储“1970-01-01 00:00:01 UTC”到“2038-01-19 03:14:07 UTC”之间的时间
字符串类型
CHAR 与 VARCHAR
类型 | 字节数 | 用途 |
---|---|---|
CHAR | 0-255 bytes | 定长字符串 |
VARCHAR | 0-65535 bytes | 变长字符串 |
- 如果 CHAR 数据的实际长度比 CHAR 类型声明的长度小,则会在右侧填充空格以达到指定的长度。定义 CHAR 类型字段时,声明的字段长度即为 CHAR 类型字段所占的存储空间的字节数。当 MySQL 检索 CHAR 类型的数据时,CHAR 类型的字段会去除尾部的空格
- VARCHAR 类型的字段所占用的存储空间为字符串实际长度加 1 个字节。检索 VARCHAR 类型的字段数据时,会保留数据尾部的空格
TEXT
类型 | 允许的长度 |
---|---|
TINYTEXT | 0 ~ 255 字节 |
TEXT | 0 ~ 65535 字节 |
MEDIUMTEXT | 0 ~ 16777215 字节 |
LONGTEXT | 0 ~ 4294967295 字节 |
在向 TEXT 类型的字段保存和查询数据时,系统自动按照实际长度存储,不需要预先定义长度。
允许的长度是指实际存储的字节数,而不是实际的字符个数,比如一个中文字符占两个字节, 那么 TEXT 类型可存储 65535/2 = 32767 个中文字符,而 varchar(100)可存储 100 个中文字符,实际占 200 个字节,但 varchar(65535) 并不能存储 65535 个中文字符,因为已超出范围(varchar 要预留 1 到 2 个字节存储这个字符的长度 65535×2 = 131072,最大只能到 65533)。
如果列声明的长度超过 255,则使用两个字节来存储长度,否则 1 个字节,当不允许非空字段的时候(因为要用一个字节来存储不可为空的标识),当允许非空字段的时候只能到 65532(省下了存储非空的那个字节)。
二进制类型
- 二进制类型存储原始的二进制数据(如图片,视频,exe 文件等)。文本类型(TEXT)用来存储字符字符串(如由英文字符、中文字符或其它语言字符组成的字符串)。
- 二进制类型没有字符集,并且排序和比较基于列值字节的数值。而 TEXT 类型有字符集,并且根据字符集的校对规则对值进行排序和比较。
BINARY 与 VARBINARY
类型 | 取值范围 |
---|---|
BINARY(M) | 字节数为 M,允许长度为 0~M 的定长二进制字符串 |
VARBINARY(M) | 允许长度为 0~M 的变长二进制字符串,字节数为值的长度加 1 |
BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,只是它们存储的是二进制字符串,M 参数指定该二进制数的最大字节长度为 M
- BINARY 类型的长度是固定的,在创建表时就指定了,不足最大长度时的空间后边由″\0″补全。
- VARBINARY 类型的长度是可变的,在创建表时指定了最大的长度,其长度可以在 0 到最大长度之间,在这个最大值范围内使用多少就分配多少。
注意:当使用 where 检索时,因为 binary 会自动使用 ‘\0’填充字符,此时就需要加上 ‘\0’,对于 varbinary 则不会出现这种情况
BIT
类型 | 取值范围 |
---|---|
BIT(M) | M 位二进制数据,M 最大值为 64 |
- 插入数据时,使用 b’位串’ 的方式插入相应值
- 查询时,可以使用 bin() 、oct() 、hex() 函数将字段的值转成相应的二进制、八进制和十六进制。
1 | create table bit_example( |
BLOB
类型 | 取值范围 |
---|---|
TINYBLOB | 可变长二进制数据,最多 255 个字节 |
BLOB | 可变长二进制数据,最多 (2^16 - 1) 个字节(即 65535 字节) |
MEDIUMBLOB | 可变长二进制数据,最多 (2^24 - 1) 个字节(即 16777215 字节) |
LONGBLOB | 可变长二进制数据,最多 (2^32 - 1) 个字节(即 4294967295 字节) |
BLOB 是一个二进制大对象 ,可以容纳可变数量的数据。注意的是,在实际工作中往往不会在 MySQL 中使用 BLOB 类型存储大对象数据,通常会将图片、音频和视频文件存储到服务器的磁盘上 ,并将图片、音频和视频的访问路径存储到 MySQL 中。
枚举类型
ENUM 类型又称为枚举类型。在创建表时,ENUM 类型的取值范围以列表的形式指定,其基本形式如下:
1 | 属性名 ENUM('值 1', '值 2', ..., '值 n') |
其中,“属性名”参数指字段的名称,“值 n”参数表示列表中的第 n 个值。ENUM 类型的值只能取列表中的一个元素,其取值列表中最多能有 65535(2 个字节)个值。如果数据值列表在 255 个以内,那么一个字节就够,如果超过 255 但是小于 65535,那么系统采用两个字节保存。
列表中的每个值独有一个顺序排列的编号,MySQL 中存入的是这个编号,而不是列表中的值,默认编号从 1 开始
如果 ENUM 类型加上了 NOT NULL 属性,其默认值为取值列表的第一个元素。如果不加 NOT NULL 属性,ENUM 类型将允许插入 NULL,而且 NULL 为默认值。
1 | CREATE TABLE `test_gender` ( |
集合类型
在创建表时,SET 类型的取值范围就以列表的形式指定了,其基本形式如下:
1 | 属性名 SET('值 1', '值 2', ..., '值 n') |
其中,属性名参数指字段的名称,“值 n”参数表示列表中的第 n 个值,这些值末尾的空格将会被系统直接删除,其基本形式与 ENUM 类型一样。SET 类型的值可以取列表中的一个元素或者多个元素的组合,取多个元素时,不同元素之间用逗号隔开。SET 类型的值最多只能是由 64(8 个字节)个元素构成的组合(SET 会将选择的置 1,没有选择的置 0;最多 64 个元素正好可以用 8 个字节(64 位)存储所选择的)
1 | CREATE TABLE myset ( |