mysql个人学习笔记——列类型
列类型(字段类型)
整型
tinyint
:迷你整型 占用1字节 8bitsmallint
:小整型 占用2字节 16bitmediumint
:中整型 占用3字节 24bitint
:标准整型 占用4字节 32bitbigint
:大整型 占用8字节 64bit
(mysql默认整型为有符号数)
需要无符号时在类型后加unsigned
如:int unsigned
字段类型(x)
x为显示长度,当标记zerofill
时,才发挥作用
超出长度但不超出范围,不影响数据存储与显示
标记为zerofill
,当数据位数不满足显示长度时,补零
标记zerofill
时,类型默认为无符号
小数型
浮点数
float
: 占用4字节,精度为7位,多于7位时数据不准确
语法:
1、float
:不指定小数位数
2、float(m,n)
: 指定保存m个有效数字,其中小数部分有n位
不能存入超出位数的数据,但如果是系统进位后才超出的,可以存入
double
: 占用8字节 精度位15位
语法:
1、double
:不指定小数位数
2、double(m,n)
:指定保存m个有效数字,其中小数部分有n位
定点数
保证整数部分精确,但小数部分不保证精确(超出长度四舍五入)
语法:
1、decimal
:自动根据存储的数据来分配存储空间,每9个数分配4个字节进行存储,小数和整数分开
decimal(m,n) :m为总长度,不超过65;n为小数部分长度,不超过30
若输入的数据,小数部分四舍五入后进位导致整数部分长度超出范围,不能存储该数据,直接报错
时间日期类型
1、date
: 占用3个字节,格式为 ’yyyy-mm-dd’,范围为 0001-01-01 ~ 9999-12-12,初始值为0000-00-00
2、 time
: 占用3个字节,格式 ’hh:mm:ss’ 表示的是时间段,范围为 -838:59:59 ~ 838:59:59, 输入‘x hh:mm:ss
’时,存储为hh = x*24+hh,后接mm:ss
3、datetime
: 占用8个字节,格式 ‘yyyy-mm-dd hh:mm:ss’,范围为0001-01-01 00:00:00 ~ 9999-12-12 23:59:59,初始值为0000-00-00 00:00:00
4、timestamp
:时间戳,从格林威治时间(1970-01-01 00:00:00)开始到某个时间的总秒数,格式为 ’ yyyy-mm-dd hh:mm:ss’ 一个时间戳对应的其他时间类型改变时,时间戳变为现在时间
语法:timestamp DEFAULT CURRENT_STAMP ON UPDATE CURRENT_STAMP
DEFAULT CURRENT_STAMP
:默认值为当前时间戳ON UPDATE CURRENT_STAMP
:一个时间戳对应的其他时间类型改变时,时间戳变为现在时间
5、year
:占用1个字节,有2种输入格式
①yy
当yy <= 69时,存储的时间为20yy;当yy >= 70时,存储时间为19yy
②yyyy
直接存储为yyyy
字符串型
1、char
:定长字符,指定长度后,系统分配指定的空间用于存储数据
语法:char(l)
l
为指定长度 0 ~ 255
2、varchar
:变长字符,指定长度后,系统根据实际存储数据长度分配空间(不超出指定长度)
语法:varchar(l)
l
为指定长度 0~65535
由于系统根据实际存储数据长度分配空间,实际存储时会比实际数据长度多占1到2个字节来保存数据所占用空间长度
实际数据长度<=127个字符,额外占用1个字节
实际数据长度>127个字符,额外占用2个字节
ps:
1、char
的查询效率比varchar
的查询效率高。因为查询varchar
时,需查询额外占用的字节来确定长度。
2、当存储字符长度大于255时,一般使用text
(占用空间少),不用char
和varchar
对于varchar
,因为mysql的记录长度(一次插入为1条记录)不超过65535个字节,因此就算varchar
理论上可以存储65535个字符,但是不同字符集每个字符占用多个字节,实际varchar
可存储字符数小于65535
如:1、uft8
中,一个字符占3个字节 65535/3=21845,varchar
额外占用2个字节,实际可存储21844个字符
2、gbk
中,一个字符占2个字节 65535/2=32767……1,varchar
额外占2个字节,实际可存储32766个字符
文本类型
(有2种)
1、text
:存储字符文本(存储数据所在位置,而不是数据本身)
2、blob
:存储二进制文本(图片、文件),一般不使用blob来存储文件,而是用链接来指向文件
text类型(4种)
1、tinytext
:用1个字节存储
实际存储数据大小:2 * 8+1
2、text
:用2个字节存储
实际存储数据大小:2 * 16+2
3、mediumtext
:用3个字节存储
实际存储数据大小:2 * 24+3
4、longtext
:用4个字节存储
实际存储数据大小:2 * 32+4
ps:不需要特意选择text
类型,系统会自动根据实际存储数据的长度选择合适的存储类型,所以一般使用text
就可以。
enum类型(枚举)
语法:enum(数据1,数据2,…)
enum
占用1到2个字节来存储枚举数据,具体跟据实际调整,实际存储数据列表<=255,占用1个字节,实际存储数据列表>255且<65535占用2个字节
但是enum
实际存储的数据并不是输入的数据,而是下标,从1开始。
如:enum(a,b,c)
其实际存储的是1,2,3,而不是a,b,c
查询数据时,系统根据下标来读输入的数据。enum
的作用
1、规范只能插入指定的数据,或下标,且一次只能插入一个数据,用作单选选项
2、节省空间(存储下标的空间比直接存储数据的空间少)
set集合
语法:set(值1,值2,值3,…)
系统自动根据值列表计算占用多少个字节
1个字节记录8个值
2个字节记录16个值
……
1、set
实际存储的不是输入的值,而是二进制。值列表中每个值会按顺序占一个对应二进制位(置1),得到一个二进制数,再将二进制数倒置后转换成10进制数存储
二进制占位:10100001
存储转换 :10000101 —> 128+4+1 = 133
2、插入字符串格式 (‘值1,值2,值x’),可用做复选选项
3、插入时,可以插入对应的2进制转换的10进制数(前提为,对应位置上有值)
此时只占了3个位,对应10进制数不超过7
ps:由于插入10进制数需要经过计算比较麻烦,一般不使用这种方法插入值
set
的作用:
1、规范数据
2、节省空间
ps:enum
一般用作单选选项,set
一般用作复选选项