MySQL的数据类型大致分为:数值、时间和字符串
二进制
- bit [(M)]
二进制位(10001),m表示二进制位的长度(1-64),默认m=1
- tinyint
小整数,数据类型用于保存一些小范围的整数值范围
有符号:-128~127(默认是有符号)
无符号:0~255
特别的:MySQL中无布尔值,使用 tinyint(1) 构造。
整数
- smallint
- int
- bigint
// 验证默认int是否是有符号
create table userinfo(
num int
);
insert into userinfo(num) values(-9); // 操作成功,说明默认是有符号的
// 设置int是无符号的
create table userinfo(
num int unsigned;
);
insert into userinfo(num) values(-1); // 操作失败
浮点型
- decimal
十进制小数,是精确的
内部是按字符串存取的,存入什么东西,拿出来还是什么东西
create table userinfo(
num decimal(6), // 表示一共6位有效数字
nid decimal(6,2) // 6位有效数字中,其中有两位小数
);
- float
是不靠谱的,数值越大,越不精准,一般不使用
- double
也是不靠谱,数值越大,越不精准,但是相对于float会是稍微精准点,一般不使用
字符串
- char
定长,设定长度之后,无论存入值长度,最终的值都会是一个定长。最大可包含255个字符。
性能相对 varchar较高。主要体现在存取值。定长无需计算。
会存在浪费空间
create table userinfo(
name char(7) // 会在存储的时候开辟7个位置
);
insert into userinfo(name) values('we'); // 记录的是 we ,后面有5个空格
insert into userinfo(name) values('12345678'); // 记录的是 1234567,超过部分舍弃
- varchar
变长,设定长度之后,是一个最长长度。值会小于等于这个长度。最大可包含255个字符。
性能相对char 低一些
好处就是可以节省空间。
create table userinfo(
name varchar(7), // 最多会占7个位置
);
insert into userinfo(name) values('we'); // 记录的是 we,后面有5个空格
insert into userinfo(name) values('12345678'); // 记录的是 1234567,超过部分舍弃
- text
变长,用于保存较大的字符串。最多可以 65535(2**16-1)个字符
- mediumtext
变长
- longtext
变长
二进制
- tinyblob
- blob
- mediumblob
- longblob
应用场景相对较少
例如上传图片视频等,可以使用二进制形式。但是一般做法是存到本地硬盘,数据库中记录的是一个本地地址。
时间
- date
YYYY-MM-DD (1000-01-01/9999-12-31)
create table userinfo(
birthday date
);
insert into userinfo(birthday) values('1998-01-22 18:37'); // 只会存入 1998-01-22
- time
HH:MM:SS (‘-838:59:59’/’838:59:59’)
- year
YYYY (1901/2155)
- datetime
YYYY-MM-DD HH:MM:SS (1000-01-01 00:00:00/9999-12-31 23:59:59)
- timestamp
YYYYMMDD HHMMSS (1970-01-01 00:00:00/2037 年某时)
枚举(enum)
只能在其中取一个值
create table shirts(
name varchar(10),
size enum('x-small','mall','medium','large','x-large')
);
insert into shirts(name,size) values('dress shirt','large'),('t-shirt','medium'),('polo shirt','small');
集合(set)
可以取多个值
create table myset(
col set('a','b','c','d')
);
insert into myset(col) values('a,b'),('d,a'),('a,,d,a'),('d,a,d');