整型
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')