mysql个人学习笔记——列类型

列类型(字段类型)

整型

tinyint :迷你整型 占用1字节 8bit
smallint :小整型 占用2字节 16bit
mediumint :中整型 占用3字节 24bit
int :标准整型 占用4字节 32bit
bigint :大整型 占用8字节 64bit
(mysql默认整型为有符号数)

需要无符号时在类型后加unsigned
如:int unsigned

字段类型(x) x为显示长度,当标记zerofill时,才发挥作用
超出长度但不超出范围,不影响数据存储与显示
mysql个人学习笔记——列类型
标记为zerofill,当数据位数不满足显示长度时,补零
mysql个人学习笔记——列类型
标记zerofill时,类型默认为无符号
mysql个人学习笔记——列类型

小数型

浮点数

float: 占用4字节,精度为7位,多于7位时数据不准确
mysql个人学习笔记——列类型
语法:
1、float :不指定小数位数
2、float(m,n) : 指定保存m个有效数字,其中小数部分有n位
不能存入超出位数的数据,但如果是系统进位后才超出的,可以存入
mysql个人学习笔记——列类型

double : 占用8字节 精度位15位
语法:
1、double :不指定小数位数
2、double(m,n) :指定保存m个有效数字,其中小数部分有n位

定点数

保证整数部分精确,但小数部分不保证精确(超出长度四舍五入)
语法:
1、decimal :自动根据存储的数据来分配存储空间,每9个数分配4个字节进行存储,小数和整数分开
decimal(m,n) :m为总长度,不超过65;n为小数部分长度,不超过30
若输入的数据,小数部分四舍五入后进位导致整数部分长度超出范围,不能存储该数据,直接报错
mysql个人学习笔记——列类型

时间日期类型

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
mysql个人学习笔记——列类型

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:一个时间戳对应的其他时间类型改变时,时间戳变为现在时间
mysql个人学习笔记——列类型
mysql个人学习笔记——列类型
mysql个人学习笔记——列类型
5、year :占用1个字节,有2种输入格式
yy 当yy <= 69时,存储的时间为20yy;当yy >= 70时,存储时间为19yy
mysql个人学习笔记——列类型
yyyy 直接存储为yyyy
mysql个人学习笔记——列类型

字符串型

1、char :定长字符,指定长度后,系统分配指定的空间用于存储数据
语法:char(l) l为指定长度 0 ~ 255

2、varchar :变长字符,指定长度后,系统根据实际存储数据长度分配空间(不超出指定长度)
语法:varchar(l) l为指定长度 0~65535
由于系统根据实际存储数据长度分配空间,实际存储时会比实际数据长度多占1到2个字节来保存数据所占用空间长度
实际数据长度<=127个字符,额外占用1个字节
实际数据长度>127个字符,额外占用2个字节
mysql个人学习笔记——列类型
ps:
1、char的查询效率比varchar的查询效率高。因为查询varchar时,需查询额外占用的字节来确定长度。
2、当存储字符长度大于255时,一般使用text(占用空间少),不用charvarchar

对于varchar,因为mysql的记录长度(一次插入为1条记录)不超过65535个字节,因此就算varchar理论上可以存储65535个字符,但是不同字符集每个字符占用多个字节,实际varchar可存储字符数小于65535

如:1、uft8中,一个字符占3个字节 65535/3=21845,varchar额外占用2个字节,实际可存储21844个字符
mysql个人学习笔记——列类型
2、gbk中,一个字符占2个字节 65535/2=32767……1,varchar额外占2个字节,实际可存储32766个字符
mysql个人学习笔记——列类型

文本类型

(有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、规范只能插入指定的数据,或下标,且一次只能插入一个数据,用作单选选项
mysql个人学习笔记——列类型
mysql个人学习笔记——列类型mysql个人学习笔记——列类型
2、节省空间(存储下标的空间比直接存储数据的空间少)

set集合

语法:set(值1,值2,值3,…)
系统自动根据值列表计算占用多少个字节
1个字节记录8个值
2个字节记录16个值
……
1、set实际存储的不是输入的值,而是二进制。值列表中每个值会按顺序占一个对应二进制位(置1),得到一个二进制数,再将二进制数倒置后转换成10进制数存储
mysql个人学习笔记——列类型
mysql个人学习笔记——列类型
二进制占位:10100001
存储转换 :10000101 —> 128+4+1 = 133
mysql个人学习笔记——列类型

2、插入字符串格式 (‘值1,值2,值x’),可用做复选选项
mysql个人学习笔记——列类型
3、插入时,可以插入对应的2进制转换的10进制数(前提为,对应位置上有值)
mysql个人学习笔记——列类型
mysql个人学习笔记——列类型
此时只占了3个位,对应10进制数不超过7
mysql个人学习笔记——列类型
mysql个人学习笔记——列类型
ps:由于插入10进制数需要经过计算比较麻烦,一般不使用这种方法插入值

set的作用:
1、规范数据
2、节省空间

ps:enum一般用作单选选项,set一般用作复选选项