MySQL 常用数据类型

一、数值类型

  • INT(或 INTEGER): 整数值,支持 -2147483648~2147483647(如果是 UNSIGNED,为 0~4294967295,边界值都可以取到)的数。

一般来说,只需要用到 INT 类型,比如,存储数据的 id。

二、串类型

即字符串类型。

  • CHAR: 定长串。大小是 0 ~ 255 个字节。注意,不是字符。而我们在定义时用的 CHAR(n) 中的 n 表示字符。要注意,英文字符是一个字符的大小为一个字节。而中文的一个字符的长度,要分类讨论。UTF-8 编码一个汉字等 = 3 个字节;GBK编码一个汉字 = 2 个字节。它的长度必须在创建时指定,否则 MySQL 假定为 CHAR(1)
  • VARCHAR: 变长串。大小是 0 ~ 65532 个字节。同样地,要注意字节与字符的区别。如果在创建时指定为 VARCHAR(n),则可存储 0 到 n 个字符的变长串(其中 $n \leq 255$)。

串类型中最常用的就是 CHARVARCHAR 这两个类型,关于在何种情况下使用这两个类型,我曾经在一篇国外博客看到如下总结(原文链接已经遗失):

  • 经常变化的字段用 VARCAHR
  • 知道固定长度的字段用 CHAR
  • 知道固定长度的字段用 CHAR
  • 超过 255 字符的只能用 VARCHAR 或者 TEXT
  • 能用 VARCHAR 的地方不能用 TEXT

三、日期和时间数据类型

类型 大小(bytes) 取值范围 格式 用途 零值
DATE 3 1000-01-01~9999-12-31 YYYY-MM-DD 日期值 0000:00:00
TIME 3 -838:59:59~838:59:59 HH:MM:SS 时间值或持续时间 00:00:00
DATETIME 8 1000-01-01 00:00:00~9999-12-31 23:59:59 YYYY-MM-HH:MM:SS 混合日期和时间值 0000-00-00 00:00:00
YEAR 1 1901~2155 YYYY 年份值 0000
TIMESTAMP 4 1970-01-01 00:00:00~2038-01-19 03:14:07(格林尼治时间) 开始时间是 0 秒,结束时间是第 2147483647 秒 YYYYMMDD HHMMSS 混合日期和时间值,时间戳 0000-00-00 00:00:00

关于这里的取值范围,官方文档有这样的说法:

For the DATE and DATETIME range descriptions, “supported” means that although earlier values might work, there is no guarantee.

要注意,也就是说,比如 DATE 可能支持插入数据 0999-01-01,但是 MySQL 并不保证这一点。这里具有明确范围的是 TIMESTAMP。我在使用时会严格按照支持的范围进行插值。

3.1、DATE

  1. 一般来讲,我会使用严格的 YYYY-MM-DD 来给 DATE 类型的数据赋值。
  2. 使用 current_datecurrent_date()now() 来插入当前的系统时间。

示例

CREATE TABLE test_tb (
	`id` INT NOT NULL PRIMARY KEY,
	`date` DATE NOT NULL
);

INSERT INTO test_tb (`id`, `date`) VALUES (1, '2021-07-08');
# 插入当前的日期
INSERT INTO test_tb (`id`, `date`) VALUES (2, CURRENT_DATE);
INSERT INTO test_tb (`id`, `date`) VALUES (3, CURRENT_DATE());
INSERT INTO test_tb (`id`, `date`) VALUES (4, NOW());

SELECT * FROM test_tb;

3.2、TIME

  1. 注意到 TIME 类型的范围是 -838:59:59~838:59:59,838 这个表示小时的数字是为了表示某种特殊需要的时间间隔。
  2. 一般来说,只需要严格按照格式 HH:MM:SS 进行插值即可。
  3. 使用 current_timecurrent_time()now() 来插入当前时间。

示例

CREATE TABLE test_tb02 (
	`id` INT NOT NULL PRIMARY KEY,
	`time` TIME NOT NULL
);

INSERT INTO test_tb02 (`id`, `time`) VALUES (1, '23:26:28');
# 插入当前的日期
INSERT INTO test_tb02 (`id`, `time`) VALUES (2, CURRENT_TIME);
INSERT INTO test_tb02 (`id`, `time`) VALUES (3, CURRENT_TIME());
INSERT INTO test_tb02 (`id`, `time`) VALUES (4, NOW());

SELECT * FROM test_tb02;

3.3、DATETIME

  1. 我在插值时会严格按照格式 YYYY-MM-DD HH:MM:SS 来进行插值。
  2. 使用 now() 来插入当前系统的日期和时间。

示例

CREATE TABLE test_tb03 (
	`id` INT NOT NULL PRIMARY KEY,
	`datetime` DATETIME NOT NULL
);

INSERT INTO test_tb03 (`id`, `datetime`) VALUES (1, '2021-07-26 23:26:28');
# 插入当前的日期和时间
INSERT INTO test_tb03 (`id`, `datetime`) VALUES (4, NOW());

SELECT * FROM test_tb03;

3.4、YEAR

  1. 我会严格按照格式 YYYY 来进行插值。

示例

CREATE TABLE test_tb04 (
	`id` INT NOT NULL PRIMARY KEY,
	`year` YEAR NOT NULL
);

INSERT INTO test_tb04 (`id`, `year`) VALUES (1, '2021');

SELECT * FROM test_tb04;

3.5、TIMESTAMP

  1. TIMESTAMP 类型在 MySQL 中也是以 YYYY-MM-DD HH:MM:SS 的形式显示的,其形式和 DATETIME 一样,它们的差异在于范围。
  2. 这里我就直接使用给 DATETIME 赋值的方式来给 TIMESTAMP 赋值。
  3. 使用 now() 插入当前系统的时间。

示例

CREATE TABLE test_tb05 (
	`id` INT NOT NULL PRIMARY KEY,
	`timestamp` TIMESTAMP NOT NULL
);

INSERT INTO test_tb05 (`id`, `timestamp`) VALUES (1, '2021-07-26 23:26:28');
# 插入当前的日期和时间
INSERT INTO test_tb05 (`id`, `timestamp`) VALUES (4, NOW());

SELECT * FROM test_tb05;


MySQL 常用数据类型
http://fanyfull.github.io/2021/08/04/MySQL-常用数据类型/
作者
Fany Full
发布于
2021年8月4日
许可协议