字段类型表示数据类型

PHP有三种主要的八种数据类型。

SQL有三种数据类型:数字、字母和时间日期。

数值型

此字段只能存储数值。算术运算中使用的所有数值

数值分为整数型和小数型

整数类型分为多个类:tinyint、smallint、mediumint、int和bigint

Tinyint:以一个字节存储整数数据的迷你整数,可以存储256个不同的数字。

Smallint:以2字节存储整数数据的小整数,可存储65536个不同的数值

Mediumint:将整数数据存储为3字节的中间整数

Int:标准整数,以4字节存储整数数据。大约超过42亿。

Bigint:以8字节存储整数数据的大整数

类型字节最小值(有符号/无符号)最大值(有符号/无符号)tinyint 1-128/0127/255 smallint 2-32768/032767/65535 mediumint 428

数据库是高效的数据存储和处理。

如人的年龄一个字节足够存,如果使用4个字节,意味着要浪费3个字节,读取效率要降低。

根据具体的实际业务产生的。

错误:超出实际数据类型的范围

显示宽度

指的是当数据的宽度小于某个指定宽度时,采用填充的方式来保证数据显示指定宽度。

显示宽度不会改变原来值的大小。是在原来数值的左边进行0填充。

显示宽度,默认不会产生填充0的效果,需要配合0填充属性,zerofill

zerofill会将有符号的整型转成无符号

有符号和无符号

无符号指的是数组从0开始,没有负数

有符号指的是有负数,默认是有符号的

声明数据类型是无符号:语法:字段 字段类型 unsigned;//无符号声明

小数型:有小数部分的数值

小数型分为:浮点型和定点型

浮点型和定点型的区别在于精度

浮点型

float和double

float:单精度,4个字节,7位数字

double:双精度,8个字节,16位数值

为什么浮点数占用相同的字节数,表示的数值却大很多?

整型:4个字节32位,都是用来保存数值大小

浮点型:4个字节32位,其中有一部分表示数值大小,还有一部分表示指数大小

浮点数使用

通常浮点数使用语法如下:

float(M,D):M表示数值的总长度,D表示小数部分的长度

float(4,2):表示小数有两位,整数部分2位

浮点数:会保证精度范围内的精确值,而精确范围之外的都是不准确的。

浮点数指定的整数部分的长度是不能超出

浮点数指定的小数部分可以超出长度范围,但是会对小数部分进行四舍五入

因为浮点会有丢失精度的问题,1浮点数适用比较少,2浮点数不用于比较。

定点型

decimal(M,D):M表示最大显示长度,D表示小数部分的长度

定点性能够保证精度。精度之外也会进行四舍五入,指的小数部分

定点型和浮点型的比较

decimal是内存变长数据类型

decimal(65,30);

数值型的应用

1.大部分的情况下使用整数型,只要没有小数,前提不要超出整型所能表示的最大范围

2.凡是跟钱相关,一定是定点数。银行账户,商品价格

3.需要非常大的数据表示,同时对精度要求没有那么高的情况下使用浮点型

虽然对于数据库的设计并不要求那么苛刻,但是一个良好程序员应当对数据的值进行判断,然后选择合适的数据类型。

字符型

SQL将字符分成了好多种:char,varchar,text,blob,enum,set

char:char(L),L表示字符长度,L的最大值是255

varchar:varchar(L),L表示字符长度,L的最大值65535个

text:text,表示文本

blob:blob,表示二进制文本

enum:enum(元素1,元素2,。。。),枚举类型,表示值是元素中的某一个

set:set(元素1,元素2,。。。),集合类型,表示值是元素中的某一些

char:字符长度,指的不管当前字段里面存放多少个字符,内存占用长度,永远是指定的L长度

char(10):表示最多可以存放10个字符,如果用户只存入“a”一个字符,那么系统也将为该字段分配10个字符的内存空间

varchar:字符长度,指的是最多可以存放L字符,但是如果存放的实际字符数不足L长度,系统只会分配实际字符所需要的内存长度,但是因为varchar是变长的,所以系统在读取的时候不知道该读取多长的内存,系统会在存入数据的时候额外的分配一个或多字节来保存字符的实际长度

utf8字符集

字符Char(4)Varchar(4)实际分配内存
A12字节3个字节Char12个字节,varchar4个字节
Abcd12字节12个字节Char12个字节,varchar13个字节
Abcde不能插入不能插入超过指定长度系统报错

正常情况

数据实际长度超过指定长度

当前mysql是以严格模式执行,当数据的类型或者数据的大小超出指定范围时,系统会报错,而不能正常执行。

集成环境中,如wamp,phpstudy是采用非严格模式执行,系统会对数据的类型以及数据的长度进行自动转换,即便数据错了,也不会出现问题。

char与varchar的区别

1.char不需要去判断字符的长度,只需要直接读取,所以效率高

2.varchar会根据实际内容分配内存,因此内存利用率高,不会浪费内存

3.varchar比char能够存储的字符数要大得多

如果选择使用char还是varchar?

1.存储的是一些固定长度的数据,使用char,电话号码,身份证号码,手机号码,银行卡号,密码(如果采用加密方式md5,得出来的长度是定长的)等

2.存储的是一些可变长度的数据,使用varchar,名字,用户名,大部分的数据都是varchar类型

3.当实际存储字符长度超过255的时候,两者基本都不用,text来保存

text和blob

text保存字符文本

blob保存二进制文本

大于255长度字符串通常使用text来进行保存。

enum:枚举类型

指的是当前字段存储值,必须是枚举中某一个。

enum使用2个字节保存,能够存放65535个内容

当字段类型被设置成枚举类型之后,系统会对插入的数据进行判断,如果数据不属于枚举所定义的类型,那么数据就不合法

枚举的意义:限制数据结果,只有符合枚举定义的结果能够被保存。

最大的意义:节省空间

枚举类型里面的值,实际存储的不是字符,而是数字。但是系统做了一个对应关系,来保存了该枚举类型与数值的对应关系。

查看一个字段是否是数值:select 字段+0;mysql会将该字段进行自动转化,成数值然后进行计算并最终输出数值结果

枚举类似单选框

枚举数据库处理原理

当一个已经有值的枚举字段,被修改之后,系统会将该修改后的枚举重新应用到所有数据上,所以不会导致数据错误。

应用枚举有什么好处?

1.枚举能够规范数据

2.枚举能够大量节省空间

但是作为PHP程序员,很少使用。

set:集合

set(元素1,元素2.。。。。),系统分配8个字节用来保存数据,元素能出现64个元素

集合类似复选框。

其中每一个元素都代表一个字节中的一位,类似开关。

插入数据和查看数据,集合数据的插入顺序与定义的顺序无关

虽然用户看到的都是具体数据,但是实际上数据库存储的却是数值

集合中每一个元素代表一个字节中的位,如果选中表示该位为1,否则为0,最后,将整个对应二进制倒过来,再计算其值

PHP会不会使用集合?一般PHP不会这么去用

集合的使用从数据库的角度出发效率非常高,但是从PHP应用的角度出发不是很方便。

时间日期类型

mysql提供了多中事件日期类型

datetime,date,time,timestamp,year

datetime:日期时间,格式:yyyy-mm-dd HH:ii:ss,0000 – 9999年

date:日期时间的日期部分

time:日期时间的时间部分,表示是一个时间段,过去的某个时间到将来的某个时间

timestamp:时间戳,是当前时间戳的日期时间格式显示,是一个标准整型:格式yyyy-mm-dd HH:ii:ss,与datetime的区别是显示的数据大小不一样

year:年份,1个字节存储,year(4)|year(2),4位表示1900 – 2155,2位表示70-69(即将被放弃)

类型显示格式取值存储空间零值
DATETIMEYYYY-MM-DD HH:MM:SS'1000-01-01 00:00:00'到'9999-12-31 23:59:59'80000-00-00 00:00:00
TIMESTAMPYYYY-MM-DD HH:MM:SS是‘1970-01-01 00:00:00’到2038-01-19 03:14:0740000-00-00 00:00:00
DATEYYYY-MM-DD'1000-01-01'到'9999-12-3130000-00-00
TIMEHH:MM:SS-838:59:59'到'838:59:59'300:00:00
YEARYYYY1901到215510000

对应的表

数据插入和显示效果

time类型

作为数据库管理者,考虑的是数据库执行效率,和如何节省空间。

作为PHP程序员,以后存储时间基本上是用int,时间戳,因为PHP时间处理很强大。

mysql中一条记录的长度不能超过65535个字节。

create table test_length(

id int, — 4个字节

name char(10), — 30个字节

describe varchar(), — (65535 – 34)/3

)charset utf8;

因为字段里没有一个强制规定不为空null,mysql需要从65535个字节里保留一个来存储null

不允许为空之后,把null所需要的一个字节给释放出来

text不占用数据长度(内容不占用数据长度,而本身需要占用10个字节)

不同的字符集下,能存储的varchar的最大字符数

GBK

UTF8

发现在显示创建语句的时候,系统给自动添加一部分信息。

关联文章:重蔚php学习第三十一天笔记——数据库校对集及存储引擎及乱码

相关推荐