文章目录
1. 数据类型的分类
1.1 数值类型
整形类型 | |
---|---|
tinyint[unsigned] | 有符号的范围是-128~127 无符号的范围是0~255 默认为有符号值 |
smallint[unsigned] | 有符号的范围是 -2^15 ~ 2^15-1 无符号的范围是0~2^16-1 |
int [unsigned] | 有符号的范围是-2^31~ 2^32-1 无符号的范围是0~2^32-1 |
bigint[unsigned] | 有符号的范围是-2^63~ 2^63-1 无符号的范围是0~2^64-1 |
小数类型 | |
---|---|
float[(m,d)][unsigned] | m指定显示长度、d指定小数位数,占用4字节 |
double[(m,d)][unsigned] | 精度比float大,占用8个字节 |
decimal(m,d) [unsigned] | 定点数m指定长度 d表示小数点的位数 |
1.1.1 tinyint类型
1.1.2 bit类型
基本语法:bit[(M)] :位字段类型、M表示每个值的位数、范围从1到64、如果M被忽略 默认为1
注意:
bit 字段在显示时、是按照ASCII码对应的值显示
如果我们只存在0和1 这时可以不用确定每个值的位数
1.2.3 小数类型
1.2.3.1 float类型
float[(m,d)] [unsigned] m指定显示长度、d指定小数位数、占用空间4个字节
float(4,2)表示的范围是-99.99~99.99 MySQL在保存值时会四舍五入
float(4,2) unsigned 表示的范围是0~99.99
1.2.3.2 decimal类型
decimal(m,d) [unsigned]:定点数m指定长度、d表示小数点的位数
decimal(5,2)表示的范围是:-999.99~999.99
decimal(5,2) unsigned 表示的范围是0~999.99
由图我们发现decimal的精度更加准确、所以如果希望小数的精度高建议使用decimal
1.2.3.3 float、double、decimal比较
float表示的精度大约是七位左右、decimal整数最大位m为65,支持小数的最大位数是d为30 如果d被省略、默认为0 如果m被省略、默认为10
如果希望小数的精度更高,推荐使用decimal
1.2 字符串类型
1.2.1 char
语法:char(L) 固定长度字符串、L是可以存储的长度,单位为字符 最大长度可以是255
char(2)表示可以存放两个字符,可以是字母或者汉字但是不能超过两个
1.2.1 varchar
语法:varchar(L) 可变长度字符串、L表示字符长度,最大长度为65535个字节
关于varchar(L)中,这个L值和编码密切相关
- varchar的长度可以指定为65535字节之间,但是有1 ~ 3个字节用于记录数据大小,所以说varchar的有效值是65532
- 当表编码是utf8时,varchar(n)的参数n的最大值是65532/3=21844【因为在utf中、一个字符占三个字节】
- 当我表编码是gbk时,varchar(n)的参数n的最大值是65532/2=32766【因为在gbk中 一个字符占两个字节】
1.2.3 char和varchar
实际存储 | char(4) | varchar(4) | char占用字节 | varchar占用字节 |
---|---|---|---|---|
abcd | abcd | abcd | 4*3=12 | 4*3+1 = 13 |
A | A | A | 4*3=12 | 1*3+1=4 |
Abcde | 存不下 | 存不下 | 数据超过长度 | 数据超过长度 |
- 如果数据长度都一样 建议使用定长char 比如:身份证号、手机号
- 如果长度有变化,就使用变长
- 定长的磁盘空间比较浪费 但是效率高
- 变长的磁盘比较节省、但是效率低
1.3 时间和日期类
1.3.1 datetime、date、timestamp
datetime 时间日期 格式‘yyyy-mm-dd hh:ii:ss’表示范围是1000到9999 占用8个字节
date:日期 ‘yyyy-mm-dd ’ 占用三个字节
timestamp:时间戳 从1970年的开始的 和datetime完全一致 占用4个字节
更新数据: update 表名 set 属性=新值;
1.4 String类
1.4.1 enum和set
enum:枚举,‘单选’类型
该设定只是提供若干个选项的值,最终一个单元格中,实际只存储其中一个值。
set:集合,‘多选类型’
该设定只是提供若干个选项的值,最终一个单元格中,可存储其中任意多个值;
举例;案例:有一个调查表votes,需要调查人的喜好, 比如(登山,游泳,篮球,武术)中去选择(可以多选),(男,女)[单选]
create table votes(
username varchar(30),
hobby set('登山','游泳','篮球','武术'),
gender enum('男','女'));
插入一系列数据:
查询:
可见不能查出所有爱好为登山的人
集合查询使用find_in_set函数:
1.4.2 find_in_set
find_in_set(sub,str_list);如果sub在str_list中,则返回下标,如果不在,返回0;str_list是用逗号分隔的字符串