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只能反映出插入时的当地时区,支持的时间范围较大
总结:
所选择的类型在满足要求的条件下,越简单越好,能保存数值的类型越小越好