整型
tinyint 1字节=8bit

int 4字节

smallint 2字节

bigint 8字节

整型默认的范围包括负数,即在取值范围内(正数+0)的个数=负数个数

CREATE TABLE t2(n tinyint);

insert into t2 values (-1);

CREATE TABLE t3(n int(10) unsigned); #unsigned表示不包括负数

int(10) #int类型本身是4字节,10表示显示的宽度,即显示多少位,不影响数据的存储,没有必要设置

浮点型
float(m,d) #m表示数字个数,最多为255,d为小数点后多少位,最大为30

double(m,d) #m表示数字个数,最多为255,d最大为30

decimal(m,d) #m表示数字个数,最多为65,d最大为30

CREATE TABLE t4 (x float(255,30)); #一般float就够用了

CREATE TABLE t5 (x double(255,30));

CREATE TABLE t6 (x decimal(65,30)); #decimal的精度最高,double其次,float最低

日期类型
year YYYY

date YYYY-MM-DD

time HH:MM:SS

datetime YYYY-MM-DD HH:MM:SS

timestamp 和datetime 的格式一样,但表示的时间范围小,timestamp 4字节,datetime 8字节,一般用datetime

字符串类型
char #定长字符串

varchar #变长字符串

char(5) #5表示字符的个数,如果传入字符的不够5个,用空格在右边补全

varchar(5) #5表示字符的最大个数,如果传入的不够5个,不补全

CREATE TABLE t7 (name char(5));

CREATE TABLE t8 (name varchar(5));

insert into t7 values ('李杰 '); #李杰后面有空格

select char_length(name) from t7; 结果为2,默认会把右边的空格去掉,

设置以下语句后,结果为5

SET SQL_MODE='PAD_CHAR_TO_FULL_LENGTH';

select char_length(name) from t8; 结果始终为3

等值查询会忽略右边空格,不会忽略左边和中间的空格

select * from t7 where name='李杰'; #可以查到

select * from t7 where name='李杰 '; #可以查到

select * from t7 where name like '李杰'; #结果查不到数据

char 存取都快,因为定长简单

varchar 存取都慢,因为要记录每一个数据的长度,

不同的编码方式下,每一个字符占用的存储空间不同

枚举和集合类型

枚举:多个里面选一个,gender enum('female','male')

集合:多个里面选多个,intersets set('eat','music','read','play')