一、数字类型

类型 大小 用途
BIT 二进制
TINYINT 1字节 小整数值
INT or INTEGER 4字节 大整数值
BIGINT 8字节 极大整数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 小数值
FLOAT 4字节 单精度浮点数值
DOUBLE 8字节 双精度浮点数值
BOOL, BOOLEAN 布尔值
  • BIT[(M)]

二进制位(101001),m表示二进制位的长度(1-64),默认m=1

  • TINYINT[(M)] [UNSIGNED] [ZEROFILL]

小整数,数据类型用于保存一些范围的整数数值范围:

范围(有符号) 范围(无符号)
-128 to 127 0 to 255

特别的: MySQL中无布尔值,使用tinyint(1)构造。

  • INT[(M)] [UNSIGNED] [ZEROFILL]

整数,数据类型用于保存一些范围的整数数值范围:

范围(有符号) 范围(无符号)
-2147483648 to 2147483647 0 to 4294967295

整数类型中的m仅用于显示,对存储范围无限制。例如:int(5),当插入数据2时,select时数据显示为:00002

  • BIGINT[(M)] [UNSIGNED] [ZEROFILL]

大整数,数据类型用于保存一些范围的整数数值范围:

范围(有符号) 范围(无符号)
-9223372036854775808 to 9223372036854775807 0 to 18446744073709551615
  • DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]

准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。

特别的:对于精确数值计算时需要用此类型decaimal能够存储精确值的原因在于其内部按照字符串存储。

  • FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]

单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。

  • 无符号:
    -3.402823466E+38 to -1.175494351E-38,
    0
    1.175494351E-38 to 3.402823466E+38
  • 有符号:
    0
    1.175494351E-38 to 3.402823466E+38

****数值越大,越不准确****

  • DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。

  • 无符号:
    -1.7976931348623157E+308 to -2.2250738585072014E-308
    0
    2.2250738585072014E-308 to 1.7976931348623157E+308
  • 有符号:
    0
    2.2250738585072014E-308 to 1.7976931348623157E+308

数值越大,越不准确

  • BOOL, BOOLEAN

这些类型是TINYINT的同义词。零值被认为是假的。非零值被认为是正确的:

 1mysql> SELECT IF(0, 'true', 'false');
 2+------------------------+
 3| IF(0, 'true', 'false') |
 4+------------------------+
 5| false |
 6+------------------------+
 71 row in set (0.00 sec)
 8mysql> SELECT IF(1, 'true', 'false');
 9+------------------------+
10| IF(1, 'true', 'false') |
11+------------------------+
12| true |
13+------------------------+
141 row in set (0.00 sec)
15mysql> SELECT IF(2, 'true', 'false');
16+------------------------+
17| IF(2, 'true', 'false') |
18+------------------------+
19| true |
20+------------------------+
211 row in set (0.00 sec)

然而,真假的值仅仅是为了分别为1和0,别名,如下所示:

 1mysql> SELECT IF(0 = FALSE, 'true', 'false');
 2+--------------------------------+
 3| IF(0 = FALSE, 'true', 'false') |
 4+--------------------------------+
 5| true |
 6+--------------------------------+
 71 row in set (0.01 sec)
 8mysql> SELECT IF(1 = TRUE, 'true', 'false');
 9+-------------------------------+
10| IF(1 = TRUE, 'true', 'false') |
11+-------------------------------+
12| true |
13+-------------------------------+
141 row in set (0.00 sec)
15mysql> SELECT IF(2 = TRUE, 'true', 'false');
16+-------------------------------+
17| IF(2 = TRUE, 'true', 'false') |
18+-------------------------------+
19| false |
20+-------------------------------+
211 row in set (0.00 sec)
22mysql> SELECT IF(2 = FALSE, 'true', 'false');
23+--------------------------------+
24| IF(2 = FALSE, 'true', 'false') |
25+--------------------------------+
26| false |
27+--------------------------------+
281 row in set (0.00 sec)

二、时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。每个时间类型有一个有效值范围和一个”零”值,当指定不合法的MySQL不能表示的值时使用”零”值。

类型 大小(字节) 格式 用途
DATE 3 YYYY-MM-DD 日期值
DATETIME 8 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 8 YYYYMMDD HHMMSS 混合日期和时间值,时间戳
TIME 3 HH:MM:SS 时间值或持续时间
YEAR 1 YYYY 年份值
类型 范围
DATE ‘1000-01-01’ to ‘9999-12-31’
DATETIME ‘1000-01-01 00:00:00.000000’ to ‘9999-12-31 23:59:59.999999’
TIMESTAMP ‘1970-01-01 00:00:01.000000’ UTC to ‘2038-01-19 03:14:07.999999’
TIME ‘-838:59:59.000000’ to ‘838:59:59.000000’
YEAR 1901 to 2155

三、字符串类型

类型 大小(字节) 用途
CHAR(M) 0 to 255 固定长度的字符串,即使数据小于M长度,也会占用M长度
VARCHAR(M) 0 to 65535 一个可变长度的字符串,M表示在字符的最大列长度
TEXT[(M)] 0 to 65535 长文本列
MEDIUMTEXT 0 to 16777215 中等长度文本列
LONGTEXT 4294967295 or 4GB 极大文本列
ENUM(‘value1′,’value2’,…) 枚举类型
SET(‘value1′,’value2’,…) 集合类型
  • VARCHAR(M)注

虽然VARCHAR(M)使用起来较为灵活,但是从整个系统的性能角度来说,CHAR(M)数据类型的处理速度更快,有时甚至可以超出VARCHAR(M)处理速度的50%。因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡

  • ENUM(‘value1′,’value2’,…)
 1CREATE TABLE shirts (
 2 name VARCHAR(40),
 3 size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
 4);
 5INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),
 6 ('polo shirt','small');
 7mysql> SELECT name, size FROM shirts WHERE size = 'medium';
 8+---------+--------+
 9| name | size |
10+---------+--------+
11| t-shirt | medium |
12+---------+--------+
131 row in set (0.00 sec)
14UPDATE shirts SET size = 'small' WHERE size = 'large';
15COMMIT;
  • SET(‘value1′,’value2’,…)

SET是一个字符串对象,它可以有0或更多个值,每个值均必须选自一个允许值列表中,该列表在表创建时被指定。

 1mysql> CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
 2Query OK, 0 rows affected (0.01 sec)
 3mysql> INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
 4Query OK, 5 rows affected (0.01 sec)
 5Records: 5 Duplicates: 0 Warnings: 0
 6mysql> SELECT col FROM myset;
 7+------+
 8| col |
 9+------+
10| a,d |
11| a,d |
12| a,d |
13| a,d |
14| a,d |
15+------+
165 rows in set (0.00 sec)