1. 数值型


1.1 整型

类型

字节

有符号范围

无符号范围

Tinyint

1

-128~127

0~255

Smallint

2

-32768~32767

0~65535

Mediumint

3

-8388608~8388607

0~1677215

Int

4

-2147483648~2147483647

0~4294967295

Bigint

8

-9223372036854775808~9223372036854775807

0~9223372036854775807*2+1

设置无符号和有符号

-- 默认的int长度为11的有符号数
CREATE TABLE test (line1 INT) ;
-- 设置为无符号数
ALTER TABLE `test` ADD COLUMN line2 INT UNSIGNED;

插入的数值超出范围

-- 会报错
ALTER TABLE `test` ADD COLUMN line3 TINYINT UNSIGNED;
INSERT INTO `test` VALUES (-9,10,898989);

设置数据长度(长度代表显示结果中列的宽度)

ALTER TABLE `test` ADD COLUMN line4 INT(5) ZEROFILL ;
-- 会报错
INSERT INTO `test` VALUES (-9,10,89,8,-89);

显示宽度的含义是数据的长度不足时,使用0来左补齐,需要与zerofill一同使用,此时的数默认是无符号数

1.2 小数:定点数,浮点数

浮点数类型

字节

范围

float

4

±1.75494351E-38~±3.402823466E+38

double

8

±2.2250738585072014E-308~±1.7976931348623157E+308

定点数类型

字节

范围

DEC(M,D)或DECIMAL(M,D)

M+2

最大取值范围与double相同,给定decimal的有效取值范围由M和D决定

M和D的含义

ALTER TABLE `test` ADD COLUMN line6 FLOAT(5,2);
ALTER TABLE `test` ADD COLUMN line7 DOUBLE(5,2);
ALTER TABLE `test` ADD COLUMN line8 DECIMAL(5,2);
-- D 代表小数点后保留的位数,超过部分会四舍五入为3.15
INSERT INTO `test` VALUES (-9,10,89,8,89,3.147,3.147,3.147);
-- M代表整个数据的长度,会报错
INSERT INTO `test` VALUES (-9,10,89,8,89,6783.147,6783.147,6783.147);

省略M和D

CREATE TABLE test (
  line1 FLOAT,
  line2 DOUBLE,
  line3 DECIMAL
) ;
-- float默认保留两位小数,double正常保存,decimal保存四舍五入后的整数(默认M为10 ,D为0)
INSERT INTO `test` 
VALUES
  (1234.567, 1234.567, 1234.567) ; -- 1234.57, 1234.567, 1235

定点数精确度较高,像货币运算等情况考虑使用

2. 字符型


2.1 较短的文本:char,varchar

字符串类型

最多字符数

描述及存储需求

char(M,可以省略,默认为1)

M

M为0~255之间的整数

varchar(M)

M

M为0~65535之间的整数

char代表的是固定长度的字符,每次为数据分配的空间都是固定的,空间的耗费比较大,但是效率会高一些
varchar代表的是可变长度的字符,每次根据数据的长度来分配空间,但效率会低一些

2.2 较长的文本:text,blob(较长的二进制数据)


3. 日期型

日期和时间类型

字节

最小值

最大值

date

4

1000-01-01

9999-12-31

datetime

8

1000-01-01 00:00:00

9999-12-31 23:59:59

timestamp

4

19700101080001

2038年的某个时刻

time

3

-838:59:59

838:59:59

year

1

1901

2155

  • timestamp和实际时区有关,支持的时间范围较小,受MySQL版本和SQLMode的影响较大,更能反应当前地区的真实时间
  • datetime只能反映出插入时的当地时区,支持的时间范围较大

总结:

所选择的类型在满足要求的条件下,越简单越好,能保存数值的类型越小越好