title: 字段

整数类型

MySQL中为了数据空间的有效使用,设定了5种数据类型

数值型存储在MySQL中分为有符号(有负数)和无符号(纯正数)

变量名存储字节范围(有符号)范围(无符号)类型
tinyint1(-128, 127)(0, 255)迷你整型
smallint2(-32 768,32 767)(0,65 535)短整型
mediumint3(-8 388 608,8 388 607)(0,16 777 215)中整型
int4(-2 147 483 648,2 147 483 647)(0,4 294 967 295)标准整型
bigint8(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)大整型

浮点数

浮点数用于存储不是特别精确的数值

浮点数超过精度范围会四舍五入

变量名存储字节范围(有符号)范围(无符号)类型
BIGINT8 字节(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极大整数值
FLOAT4 字节(-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 字节(-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

定长型可以指定整数部分长度和小数部分的长度

  • 默认不指定, 10位有效整数, 0位小数
  • 可以指定decimal的有效位数和小数部分位数
  • 有效位数不能超过65

字符串

CHAR0-255字节定长字符串
VARCHAR0-65535 字节变长字符串
TINYBLOB0-255字节不超过 255 个字符的二进制字符串
TINYTEXT0-255字节短文本字符串
BLOB0-65 535字节二进制形式的长文本数据
TEXT0-65 535字节长文本数据
MEDIUMBLOB0-16 777 215字节二进制形式的中等长度文本数据
MEDIUMTEXT0-16 777 215字节中等长度文本数据
LONGBLOB0-4 294 967 295字节二进制形式的极大文本数据
LONGTEXT0-4 294 967 295字节极大文本数据

enum,实现将所有可能出现的结果都设计好,实际上存储的数据必须是规定好的数据中的一个。

enum 可以存65535个成员值

枚举的作用:

  1. 限定值的可能性!

  2. 速度快,比普通的字符串速度快!

create table demo1(
  value enum('red', 'green', 'white')
);
mysql> insert into demo1 values('prink');    # 插入不存在的数据会报错
ERROR 1265 (01000): Data truncated for column 'value' at row 1
mysql> insert into demo1 values('red');
Query OK, 1 row affected (0.01 sec)
mysql> insert into demo1 values(0);    # MySQL8 插入0报错不会存null值
ERROR 1265 (01000): Data truncated for column 'value' at row 1
mysql> insert into demo1 values(1);
Query OK, 1 row affected (0.01 sec)

查询映射关系

# 通过字段加0查看具体存储数值
select value, value + 0 from demo1;

字符串集合

create table demo2(
  hobby set('game', 'music', 'comic')
);
mysql> insert into demo2 values('game');
Query OK, 1 row affected (0.01 sec)

mysql> insert into demo2 values('comic, music');
Query OK, 1 row affected (0.01 sec)

mysql> select * from demo2;
+-------------+
| hobby       |
+-------------+
| game        |
| music,comic |
+-------------+
2 rows in set (0.00 sec)

日期类型

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

年: YEAR MySQL中存储年份的类型

  • MySQL中使用1个字节存储年份
  • YEAR能表表示的范围是1901-2155年(256年)
  • 特殊值0000 可以使用00或0000值插入

时间戳

时间戳: timestamp 基于格林尼治的时间记录

  • mysql中时间戳表现形式不是秒数,而是年月日时分秒格式
    • YYYY-MM-DD HH:II:SS
    • YYYYMMDDHHIISS
  • timestamp 使用4个字节存储
  • timestamp 的特点是所对应的记录不论那个字段被更新,该字段都会更新到当前时间

创建测试表

mysql> create table time(stock int, change_time timestamp);
Query OK, 0 rows affected (0.02 sec)

插入数据

mysql> insert into time values(100, '1971-01-01 00:00:00');
Query OK, 1 row affected (0.00 sec)

mysql> insert into time values(100, 19710101000000);
Query OK, 1 row affected (0.00 sec)

mysql> select * from time;
+-------+---------------------+
| stock | change_time         |
+-------+---------------------+
|   100 | 1971-01-01 00:00:00 |
|   100 | 1971-01-01 00:00:00 |
+-------+---------------------+
2 rows in set (0.00 sec)

timestamp会在自己所在记录任何位置被修改时自动更新时间

但是在MySQL8中取消了默认自动更新 需要使用on update current_timestamp

添加一个会自动更新的时间字段(MySQL8)

alter table time add n_time on update current_timestamp;

日期

日期: data用于存储年月日

  • 使用3个字节存储
  • 日期格式 YYYY-MM-DD
  • 存储区间1000-9999年

日期时间

日期时间: datetime综合存储日期和时间

  • 使用8个字节
  • 存储格式 YYYY-MM-DD HH:II:SS
  • 存储区间1000-01-01 00:00:00 到 9999-12-31 23:59:59