mysql学习之路_字段类型与属性

回顾

数据库基本知识:关系型数据库与非关系型数据库

关系型数据库:安全(磁盘)

非关系型数据库:高效(内存)

关系型数据库:建立在关系模型上的数据库,

数据结构:二维表(浪费空间)

数据库操作指令:sql(DDL,DML,DCL)

完整性约束:表内和表之间(实体)

Mysql关系型数据库:

C/S结构(直接认证发送sql指令,服务器处理指令返回结果,客户端接受结果,分析结果)

Mysql服务器对象:DBMS----->DATABASE------->TABLE------>FIELD

数据库基本操作:库操作,表操作和数据操作。

字符集问题:

中文数据问题

1,改变服务器接受数据字符集character_set_client

2,改变服务器返回数据字符集character_set_result

3,快捷方式:set names 字符集;

乱码问题:

浏览器解析:php处理

数据库处理

校对集问题:

比较规则:_bin二进制,_cs,_ci大小写

算法:快速排序。

数据类型:

列类型:

所谓数据类型:对数据进行统一分类

从系统数据角度出发就是为了使用统一方式进行管理

更好的利用有限的空间

Sql将数据类型分为三类:

数值类型,字符串类型,时间日期型。

数值型:

数值型数据:都是数据,系统将数据分为整数型和小数型

整数型:

存放的都是数据

在sql因为要考虑节省磁盘

Tingint :迷你整型,使用一个存储字节(常用),最多状态有256种

Smallint: 小整型,使用俩个字节,表示状态最多有65535种

Mediunint:中整型,使用三个字节存储

Int:表准整型,使用四个字节存储(常用)

Bigint :大整型,使用八个字节存储。

在sql中数据库全部都是默认有符号的;分正负,使用无符号数据:给约定的数据类型限定

Int unsigned --无符号,从零开始。

查看表结构的时候,发现每个字段的数据类型之后都会带一个括号,里面有指定数值

 显示宽度:数据最终显示的位数(包含符号)如-123是四位,253是三位,

显示宽度:没什么特别意义只是默认告诉用户显示的形式而已。实际上用户可以控制,不会改变数据的实际大小。

显示宽度的意义:在于当数据不够显示宽度的时候,会自动让数据变成对应的显示宽度:

通常需要搭配一个前导0来增加宽度,不改变值的大小:zerofill(零填充)

零填充的意义(显示宽度):保证数据格式。

小数型:

带小数点或者范围超过整型的数值类型。

Sql中将小数型分为俩种:浮点型和定点型

浮点型:小数点浮动,精度有限,会丢失精度。

定点型:小数点固定,精度有限,不会丢失精度。

浮点型:

浮点型数据是一种精度型数据:因为超出规定范围之后会丢失精度(四舍五入)。

浮点型分为俩种:float:单精度,占用四个字节存储数据,大概七位。

Double:双精度,占用八个字节存储数据,大概十五位左右。

创建浮点数表:浮点的使用方式:直接float。

表示没有小数部分;float(M,D)M表示总长度,D表示小数部分长度,整数部分长度为(M-1)。 浮点型数据的插入:整数部分不能超过长度,但是小数部分可以超过长度(系统会自动四舍五入)结果:浮点数一定会进行四舍五入(超出精度范围)。

浮点数如果是因为系统进位导致整数部分超出指定长度:那么系统也会允许成立。

定点型:

绝对的保持整数部分不会被四舍五入(不会丢失精度),小数部分有可能丢失(理论上小数部分也不会丢失精度)

浮点数如果进位导致长度溢出,没有问题。但是定点数不行、

时间日期型:

Datetime:时间日期,格式是YYYY-MM-DD HH:ii:ss

Date :日期就是datetime的date部分

Time:时间段,指定某个区间之间,时间到时间

Timestamp:时间戳,是从1970开始的格式与datatime一致,

Year:年份,两种格式,year(2)。

插入数据:

时间time可以说负数,year可以使用2位数插入,也可以使用四位数。

Timestamp字段:只要是当前所在记录别更新,该字段一定会自动更新成当前时间。

网站以php位实现主要操作对象,php有非常强大的日期处理函数:date,只需要一个时间戳就可以转换成任意类型函数的时间:以php为主的时候,都是在数据库使用时间戳(整型)来存储时间。

字符串类型:

在sql中将字符串分为了6类

Char ,varchar,text,blob,set和enum

Char:定长字符串

定长字符串。磁盘在定义结果的时候就已经确定了最终数据的存储长度。

Char[L]:L代表length,可以存储长度,单位为字符最大长度值为255

例:char[4]在utf8环境下需要4*3=12个字节

Varchar:变长字符串

Varchar在分配空间长度的时候,按照最大空间分配,但是实际上最终用了多少是根据具体的数据来确定,

Varchar(L):L代表字符长度理论上长度65536个字符

但是会多1到2个字节来确定存储的实际长度

例:varchar(10)确实存了十个汉字,在utf8的环境下10*3+1=31字节

如何选择定长还是变成字符串?

定长的磁盘空间比较浪费空间,但是效率高;

变长的磁盘空间比较节省但是,效率低;

如果数据基本上确定长度一样,就是定长如果数据不能确定长度(不同数据有变化)

文本字符串:

如果数据量特别大,通常超过255个字符,就会使用文本字符串,文本字符串会根据存储数据的格式进行分类:text(文字存储)和blob(二进制数据,二进制存储路径)

枚举字符串:enum

枚举:enum,事先将可能出现的结构都设计好,实际上就是存储数据必须是规定好的数据中的一个。

枚举使用方式

定义:enum(可能出现的元素列表)

如:enum(‘女’,’男’,’人妖’,’保密’,);

使用:存储数据,只能存储上面定义好的数据

例:创建枚举表,create table my_enum(

Gender enum(‘男’,’女’,’人妖’) character utf8

加入数据;作用之一就是规范数据格式

数据只能是规定数据中的一个

Insert into my_enum values(‘男’),(‘人妖’);

作用之二节省空间(枚举 别名 单选框)(存储的是数值)

在mysql中系统也是自动转换数据格式的,

证明字段存储的是数值:将取出来的+0

就可以判断出原来的数据到底是字符串还是数值,如果是字符串结果为0,否则为其他值。

例:select gender+0,gender from My_enum;

找出枚举元素的规律,按照元素出现顺序从1开始编写

枚举原理:枚举在进行数据规范的时候,系统会自动建立一个数值与枚举元素的对应关系(关系放在日志中)然后在进行数据插入的时候,系统自动将字符串转换成对应的数字存储,然后进行数据提取的时候,系统自动将数值转换成对应的字符串显示。

集合字符串:

集合跟枚举很类似:实际存储的是数值而不是字符串(集合是多选)

例:create table my_set (hobby set (‘篮球’,’足球’,’乒乓球’))charset utf8;

插入数据:可以使用多元素字符串进行组合,也可以数值。

例:insert into my_set values (‘足球’)

Insert into my_set values(2)

集合中:每一个元素对应一个二进制位,被选中为一,没有则为零,最后方向反过来

例:110------>011=3

Select hobby +0 ,hobby from my_set;

集合元素的顺序没有关系,最终系统会匹配顺序;

集合的强大功能在于能够规范数据和节省空间。

Php也可以规范数据但是对于php来说效率优先;而且数据的维护可以通过数值进行增加php的维护成本;php根本没有办法判断数据在数据库的形式。

MySql记录长度

Mysql规定:任何一条记录最长不能超过65535个字节(varchar永远达不到理论值)

Varchar实际存储长度能达到多少呢,看字符集

在utf8下varchar的实际顶配varchar(21844)21844个字符-----21844*3+2=65532+2=65534

Gbk下实际顶配varchar(32766)32766个字符           ------32766*2+2=65532+2=65534

Mysql记录中如果任何一个字段允许为空,那么系统会自动从整个记录中保留一个字节存储在null(若想释放null所占用的字节,必须保证所有字段不为空)

Mysql中text文本字符串,不占用记录长度;额外存储,但是text文本字符串也是记录的一部分一定需要占据部分长度:10字节(保留数据的地址以及长度)

列属性:

列属性:真正约束字段的是数据类型,但是数据类型的约束很单一,需要一些额外的约束来保证数据的完整性

列属性:null/not null

Default

Primary key

Unque key

Auto_increment

Comment

空属性:null

Null(默认的和not null不为空)虽然是默认的,数据基本上都是字段为空,但是实际上真正开发的时候,尽肯能地保证所有的数据都不为空;空数据没有意义,空数据不能参加运算。

列描述:comment

没有实际意义,专门用来描述字段,会根据表的创建语句保存(用来给dba)了解的。

例:comment’姓名’;

默认值:default

某种数据会经常出现在某个具体的值

想要使用某个默认值,可以不一定指定列表,不使用字段列表,可以使用default关键字代替值

例:insert into my_default values(‘张三’,18,default);

回顾

字段类型(列类型):数值型,时间日期型,字符串类型

数值型:整型,小数型(浮点与定点)

时间日期型:datetime,time,datetimestamp,year

字符串类型:定长,变成,

文本字符串(text和blob)

枚举与集合

Mysql记录长度:65535个字节

Null占一个字节

text文本不占用记录长度,本身十个字节

字段属性:空属性,列描述,默认值

上一篇:Mysql的Text和Blob的比较


下一篇:关于ajax 返回值验证问题