数据类型
01整型
类型 | 字节 | 范围(有符号) | 范围(无符号) |
---|---|---|---|
TINYINT |
1 | -27~27-1 | 0~28-1 |
SMALLINT |
2 | -215~215-1 | 0~216-1 |
MEDIUMINT |
3 | -223~223-1 | 0~224-1 |
INT |
4 | -231~231-1 | 0~232-1 |
BIGINT |
8 | -263~263-1 | 0~264-1 |
关于范围的计算方法:比如tinyint,有1个字节,一个字节是8位。计算有符号的范围,8位有一个是符号位,剩下的7位每一位有0和1两种取值,代表2的7次方128个数,正数128,负数128个。但是为了取出一个0,正数就少了1。所以是127个正数和一个零。无符号计算,1字节有8位,代表2的8次方256个数,就是从0~255。其他同理。
小知识:
-
如果你定义一个字段的数据类型是int(3)那么是不是说,插入的数据最大不能超过三位数呢?
其实不是的,你仍然可以插入更大的数,最大范围仍是上表中int的范围没有变。int(3)中的3是显示位数,意思是查询时,显示3位数,不足三位补零,若想最前面的零也显示,要配合关键词zerofill的使用。
例如:定义score时
score int(3) zerofill
。 -
无符号数据类型怎么定义?
比如声明score时
score int unsigned
02浮点型
浮点型 | 占用字节 | 范围 |
---|---|---|
float(单精度) | 4 | -3.4E+38~3.4E+38 |
double(双精度) | 8 | -1.8E+308~1.8E+308 |
浮点数声明:
float(M,D)
double(M,D)
M:总位数。插入的值总位数超过M会报错。
D:小数位数,插入的值小数位数超过D不会报错,四舍五入处理。
注意点:浮点型存的是近似值,精度有可能会丢失。例:
create table nu(
num double(20,19)
);
insert into values (1.1234567890123456789);
select * from nu ;#你会发现数变了,最后几个变成了0
03定点数
decimal(M,D)
说明:
- 定点数用于保存你要严格保存的数据,精度不会丢失,例如存款。
- 定点数是变长的,大概每9个数字用4个字节来存储,定点之所以能保存精确的小数,是因为整数和小数是分开储存的,占用资源要比浮点数多。
- 整型、定点数和浮点数都支持显示宽度(zerofill)和无符号数(unsigned)。
04字符型
数据库中,所有字符型只能用单引号。
数据类型 | 描述 | 长度 |
---|---|---|
char(长度) | 定长 | 最大255 |
varchar(长度) | 变长 | 最大65535 |
tintext | 大段文本 | 28-1=255 |
text | 大段文本 | 216-1=65535 |
mediumtext | 大段文本 | 224-1 |
longtext | 大段文本 | 232-1 |
-
char(10)和varchar(10)的区别?
答:相同点:他们最多只能保存10个字符。
不同点:char不回收多余的长度(定长),效率高,浪费空间;
varchar回收对于的空间(变长),效率低,节省空间。
-
varchar理论最大长度是65535字节,实际却达不到,具体长度与字符编码有关。
例gbk编码 , 一个字符占用2字节 , 则varchar最大长度是32767.
utf8编码中 , 一个字符占用3字节 , 则varchar最大长度是21845
-
一条完整数据(比如一个表有id,姓名,性别。三者合在一起算一条完整数据)总长度不能超过65535字节。验证:
create table t7( name varchar(21844), #utf8下最多能存21845字符,每个字符3字节 age tinyint ) charset = utf8;
上述例子会报错,是因为utf8下,varchar最大存21845字符(65535字节),外加tinyint,字节总长度超过了65535,所以会报错。
-
保存大块文本用了text,总数据长度不就超过了65535字节了?为什么不报错?
答:事实上,大块文本(text)不计算在总长度中,一个大块文本只用10个字节保存文本地址,文本另存他处。
05枚举
enum('A','B')
声明举例:sex enum('男 ','女 ')
说明:
枚举相当于一个集合,值只能从集合中选一个,值选非集合内的会报错。
-
枚举类型是通过整数来管理的,第一个值是1,第二个值是2,以此类推。验证与应用:
create table t8( name varchar(10), sex enum('男','女') ); # -------------------- insert into t8 values ('Tom','男'), ('Jerry',1), # 与第七行等效 ('Rose','女'); # -------------------- #再次表明枚举是数字,只有数字才能相加,结果也是数字。
select sex+0 from t8;
select sex from t8;
3. 枚举的优点:
1. 运行速度快(数字比字符串运算速度快)。
2. 限制数据。
3. 节省空间(一个数字就够了,省空间)。
## 06集合
> set
>
> set('爬山 ','游泳 ','读书 ')
集合相当于多项选择;**每一个集合都分配一个固定的数字,分配方式从左往右,按2^0^ , 2^1^ , 2^2^ , 2^3^**……例子中,爬山是2^0^=1;游泳是2^1^=2;读书是2^2^=4。如果你插入时,选择了爬山和读书,那么结果就是5(4+1)。
例子:
```mysql
create table t9(
hobby set('爬山','游泳','读书')
);
# 证明是数字
insert into t9 values ('爬山','读书');
select hobby+0 from t9;
无论按照什么顺序插入,其显示结果都是按照建表时的固定顺序显示的,例如你插入时 insert into t9 values ('读书','爬山');
,但是显示结果仍然是你建表时的顺序,先显示“爬山”,再显示“读书”。
07日期类型
数据类型 | 占用字节 | 描述 |
---|---|---|
datetime | 8 | 日期时间 |
date | 3 | 日期 |
time | 3 | 时间 |
timestamp | 4 | 时间戳 |
year | 1 | 年份 |
一般比较常用的也就前两个。
datetime的插入格式:
insert into uu values ('2015-10-12 10:00:00');
# 日期与时间插入,在上面括号内的基础上取你所需。
注意点:
- timestamp类型和datetime类型的形式是一样的,区别是datetime的范围是1~9999年,而timestamp是从
1970-01-01 00:00:00
~2038-1-19 11:14:07
。 - year只占用一个字节,所以只能储存255个年份,范围是1901 ~ 2155。
- time表示时间或时间间隔,范围是 -838:59:59 ~ 838:59:59。
- 其他编程语言的时间戳与数据库的时间戳有区别,其他编程语言时间戳是从1970年1月1日0时0分0秒到现在的总秒数或总毫秒数,是整数。但是数据库时间戳不是秒数,形式与datatime差不多,有日期,时分秒。
08布尔型
boolean型中true和false对应0和1;以数字的方式储存。
09数据类型小测试
- 手机号:char
- 电话号:varchar
- 性别:char enum
- 学生年龄:tinyint unsigned
- 薪水:dicimal
- 照片:binary,但一般不把照片存数据库,如果照片几百兆,数据库才几百兆,数据库直接就满了。一般在数据库存照片地址。但出题这样出,还是要选binary。