Mysql中分为三大数据类型:数值型、字符型、时间日期型
数值型
数值型分为整型和小数型(包含小数部分的数据类型)
整形
Mysql中光整型数据类型就有五种:tinyint,smallint,mediumint,int,bigint
Tinyint:迷你整型,占用一个字节保存数据,能够表示256个数值
Smallint:小整型,占用2个字节保存数据,能够表示65536个数值
Mediumint:中整型,占用3个字节保存数据
Int:标准整型,占用4个字节,42亿多
Bigint:大整型,占用8个字节保存数据
类型 |
字节 |
最小值(有符号/无符号) |
最大值(有符号/无符号) |
TINYINT |
1 |
-128/0 |
127/255 |
SMALLINT |
2 |
-32768/0 |
32767/65535 |
MEDIUMINT |
3 |
-8388608/0 |
8388607/16777215 |
INT/INTEGE |
4 |
-2147483648/0 |
2147483647 /4294967295 |
BIGINT |
8 |
-9223372036854775808/0 |
9223372036854775807/18446744073709551615 |
为什么要有这么多整型?
1. 能够最大效率的使用磁盘空间,做到最少浪费。根据实际业务分配内存空间来进行数据保证
2. 查询的效率变高
如何在项目中选择使用何种整型?
根据业务需求,某一类数据的边界值,看边界值落在那个整型范围,就是用最小的那个。
在实际操作中tinyint,int使用的较多
无符号:表示数值只能是正的,不能有负数
语法:在字段类型后面使用unsigned进行标识
Age tinyint unsigned//年龄是一个迷你整型,无符号表示(0,255);
显示宽度:占的位数,当某个数值没有达到显示宽度的时候,在数值的左边使用0来补足显示宽度
默认的,系统不会进行0填充,需要给字段显示增加一个属性:zerofill,0填充
系统默认显示的宽度是数据类型是能显示的最大宽度
0填充有一个特点:使用0填充必须使用无符号类型,不能用负数填充
0填充式专门用来配合显示宽度:显示宽度只是在数据的值没有达到指定宽度的时候使用0填充,0填充或者显示宽度都不会显示原理数值的大小,值的大小有数据类型决定
什么地方会使用显示宽度?
在一些需要使用0填充地方不改变原来值的大小,却能够用宽度来固定显示数据,保证前段数据的显示不会改变原来的css结构。比如说月份、日期、时间
小数型
带有小数部分的数据
Mysql中小数型分为两种:浮点型,定点型
浮动型:float和 double
Float:采用4个字节保存数据
Double:采用8个字节保存数据
浮点数的存储使用4个字节32位储存,第一位叫符号位,会使用符号位后面的8位用来存储街码(底数+指数),其它的用来表示数据。
浮点数会丢失精度
Float:最大有效位7位左右
Double:最大有效位15位左右
浮点数的使用方式
Float(M,D):M表示整个长度,D表示小数位的长度
数据处理
如果小数位超出指定长度,会自动四舍五入
如果在没有指定小数位时,小数部分直接忽略,整数部分超出精度进行四舍五入
浮点数只适用于那些对数值精度要求不高m但是数量特别大的数据
凡是跟钱相关绝对不用浮点数
定点型:decimal
能够自动的扩展宽度来保存数据,保证数据的精度,基于小数部分,如果超出指定长度,仍然会进行四舍五入
语法:decimal(M,D):M表示总长度,D小数长度
定点型和浮点型的区别
定点型能够保证精度,二浮点型只能保证精度之内的数据的准确性,二精度之外都会变成0
浮动型如果在四舍五入过程中,如果会让数据进行超出指定的整数长度,那么系统也是运行的
定点型如果在进位过程中超出指定的数据长度,那么将会报错
定点型的数据范围
最大长度:Decimal(65,30)
凡是涉及到钱的都会在数据库端使用decimal来进行数据的存储和运算。
字符串型
Mysql有以下字符串类型:char,varchar,text,blob,enum,set
char(定长字符串):表示磁盘会分配固定的长度的空间去存储数据
1. 如果数据不够长度,空间依然被占用
2. 如果数据超出长度,系统会报错
语法:char(L),L表示长度,L表示的字符长度,L的最多值255
varchar(变长字符串):表示磁盘空间会根据实际的长度来分配存储空间,但是长度不能超过指定长度vachar(L),存储的数据只能小于或者等于L个字符,L的理论值65535
varchar在存储之外还有一个额外的1到2个字节来保存当前varchar的实际占用长度
char和varchar对比(utf8):一个字符 = 3个字节
字符 |
Char(4)占用字节数 |
Varchar(4)占用字节数 |
Char实际所占字节数 |
Varchar实际所占字节数 |
A |
4*3=12 |
12 |
3+1=4 |
|
ABCD |
4*3=12 |
4*3+1=13 |
12 |
13 |
|
Char(255) |
Varchar(256) |
|
|
256个字符 |
255*3=765 |
256*3+2=770 |
765 |
770 |
255个字符 |
255*3=765 |
255*3+1=766 |
765 |
766 |
在非严格模式下(集成环境中),都是对类型要求不严格,所以当数据类型不符合要求,所以当数据类型不符合要求的时候,系统会进行自动转换或者截取,从而不报错。但是在严格模式中,系统不会做任何处理,只会做判断,如果失败就报错。
如何区分使用vhar还是varchar
1. 所有字符串长度必须在255之内
2. 如果之风范创长度是固定,那么使用char
Md5值,身份证,手机号等等
3. 如果字符串长度不固定,那么所有vharchar
姓名,邮箱…
Char和varchar效率区别
1. Char的效率比varchar要高
2. Varchar比char节省空间
当字符串长度超过255之后,就不会使用varchar来进行数据保存,使用text
Text:字符串文本
Blob:二进制文本
在记录里面不计算长度(不占记录长度),基本可以“无限”存储数据
Enum:枚举,列出一系列的元素,可以从一堆元素中任选一个作为实际的值(单选框)
语法:enum(元素1,元素2….)
枚举的意义?
1. 限制用户的输入(规划数据)
2. 能够节省内存空间
枚举使用两个字节来保存数据,能够保持65535个数据 ,是因为枚举实际保存的不是字符串而是字符串元素所对应的数组
在定义枚举的过程中,使用的虽然是字符串元素,但是在实际保存数据的时候,保存的是元素对应的数值
如何证明枚举实际存储的是数组呢?
使用算术运算符:mysql会在碰到算术运算符之后,自动进行数据转换,转换成数组类型
转换的标准与PHP一致
语法:select字段 + 0 from表名
Set:集合,在定义字段之初,为字段值做一系列的限制,实际存储值的时候,可以是集合类型中的多个元素。集合相当于多选框
Hobby set(‘游泳’,‘爬山’,’打球’,‘骑车’,’旅游’);
集合是使用8个字节,只能保持64个数据。集合定义的数据类型里面出现的可能的元素的最多个数为64个。
集合可以在插入数据的时候,将实际的顺序打乱,但是在最终保持的时候,系统会将顺序与定义的时候的顺序对比,变成原来的
集合实际存储的也是数值
原理:每一个枚举元素,都占据一个位作为自己的空间,该空间上,如果当前元素被选中,那么值为1,否则为0。最终去计算十进制结果的时候,是将所有的二进制先颠倒过来,在计算。
使用set的好处
1. 节省空间
2. 能够规范数据
对于枚举和集合,在进行数据插入的时候,还可以使用数值插入
数据库的字符串类型有很多,但是是从数据库管理员的角度出发去考虑问题
1. 考虑磁盘空间的开销
2. 考虑执行效率
做完PHP程序员,基本不考虑这些,只考虑如何方便PHP进行操作。所以真正配合PHP使用的字符串:char,varchar,和text
时间日期格式
类型 |
显示格式 |
取值 |
存储空间 |
零值 |
DATETIME |
YYYY-MM-DD HH:MM:SS |
'1000-01-01 00:00:00'到'9999-12-31 23:59:59' |
8 |
0000-00-00 00:00:00 |
TIMESTAMP |
YYYY-MM-DD HH:MM:SS |
是‘1970-01-01 00:00:00’到2038-01-19 03:14:07 |
4 |
0000-00-00 00:00:00 |
DATE |
YYYY-MM-DD |
'1000-01-01'到'9999-12-31 |
3 |
0000-00-00 |
TIME |
HH:MM:SS |
-838:59:59'到'838:59:59' |
3 |
00:00:00 |
YEAR |
YYYY |
1901到2155 |
1 |
0000 |
Datetime:表示年月日时分秒,能够表示9000年,占用8个字节
Timestamp:时间戳,使用标准整型存储,表示确是年月日,时分秒
Date:日期部分,可以表示1000-9999年
Time:时间部分,表示的是一个时间段,从过去什么时间到以后某个时间
Year:年,使用一个字节存在,一个字节只能表示256个数值,在计算的时候加上1900再输出
时间戳不能是PHP中的时间戳,而应该是时间戳范围内对应的时间格式
注意:
1. 在mysql中,任意一条记录(所有字段的集合)的长度不能超过65535个字节。
所以varchar能够存储的数据的真实长度会变化很大
GBK:varchar能够存储多少个字符?
65535/2 = 32767.5
utf8:varchar能够存储多少个字符?
(65535– 2) / 3 = 21844.3
2. 在mysql中,如果所有的字段里,没有全部不允许为null,那么需要一个字节来保存null
所有字段都不为null
留出一个字节保存null
3. text不占存储长度空间,但是text本身需要占据10个字节来保存字段名。