回顾

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

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

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

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

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

数据库操作指令: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学习之路_字段类型与属性的更多相关文章

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

    字段属性: 主键,唯一键,自增长. 主键: Primary key 主要的键,一张表只能有一个字段能使用对应的键,用来唯一约束该字段里面的数据不能重复,称之为主见. 一张表最多只有一个主键. 增加主键 ...

  2. mysql学习之路_事物_存储过程_备份

    数据备份与还原 备份:将当前已有的数据保留. 还原:将已经保留的数据恢复到对应表中 为什么要做数据备份 1,防止数据丢失,被盗,误操作 2,保护数据记录 数据备份还原方式有多种:数据表备份 单表数据备 ...

  3. mysql学习之路_联合查询与子查询

    联合查询 联合查询:将多次查询(多条select语句)在记录上进行拼接(字段不会增加). 语法:多条select语句构成,每条select语句获取的字段必须严格一致(但是字段类型无关). Select ...

  4. mysql学习之路_外键

    回顾4 连接查询: 连接多张表到一起,不管记录数如何,字段数一定会增加. 分类:内连接,外连接.自然连接,交叉连接, 交叉连接:cross join (笛卡尔积) 内连接:inner join,左右两 ...

  5. mysql学习(四)-字段类型

    mysql数据类型: 数值型: 整形:int 浮点型:float double decimal:定点型 日期: date  '2012-01-02' time '10:01:01' datetime ...

  6. mysql学习之路_高级数据操作

    关系 将实体与实体的关系,反应到最终数据表的设计上来,将关系分为三种,一对多,多对多,多对多. 所有关系都是表与表之间的关系. 一对一: 一张表的一条记录一定只对应另外一张表的一条记录,反之亦然. 例 ...

  7. mysql学习之路_基础知识

                    Mysql php阶段将数据库分为三个阶 基础阶段: mysql数据库的基本操作(增删改查),以及一些高级操作(视图,触发器,函数,存储过程等),PHP操作没有sql数 ...

  8. mysql学习之路_视图

    视图 视图:view是一种有结构的但是没有结构来源的虚拟表,虚拟表的结构来源不是自己定义的而是从对应的基表中产生(来源) 创建视图 基本语法: Create view 视图名字 as select 语 ...

  9. mysql学习之路_连接查询

    回顾 列属性:主键,自增长,唯一键. 关系:一对一,一对多,多对多 三层范式: 1NF:字段设计必须符合原子性 2NF:不存在部分依赖(没有复合主键) 3NF:不存在传递依赖(实体单独成表) 逆规范化 ...

随机推荐

  1. c#引用命名空间的作用

    System 包含用于定义常用值和引用数据类型.事件和事件处理程序.接口.属性和处理异常的基础类和基类.其他类提供支持下列操作的服务:数据类型转换,方法参数操作,数学计算,远程和本地程序调用,应用程序 ...

  2. tomcat配置的环境变量catalina.home和catalina.base 区别

    本篇文章原创地址为:http://blog.csdn.net/you23hai45/article/details/27726147 这两个属性仅在你需要安装多个Tomcat实例而不想安装多个软件备份 ...

  3. Mysql: Specified key was too long; max key length is 1000 bytes

    在使用quartz持久化的时候,笔者使用的mysql,为了以后方便迁移数据,笔者的Mysql默认引擎MyISAM 于是顺理成章的执行了quartz-2.2.3\docs\dbTables\tables ...

  4. SqlServer添加触发器不让删除数据

    触发器是:instead of delete 类型,注意了:instead类型的触发器相当于: DELETE命令过来后,直接走触发器中的代码,再往下,没有了…… 就是说,这个触发器会屏蔽掉你所有的DE ...

  5. Java 7.35 游戏:猜字游戏(C++&Java)

    Ps: 有人可能好奇我为什么大费周章的去写主函数,而不直接把所有操作放在类中,Why?类就好比骨干(存放核心的数据和功能),最好提供接口, 避免了类中的输入输出,当然,这也不是绝对的. C++: #i ...

  6. PAT 1029 旧键盘(20)(代码)

    1029 旧键盘(20)(20 分) 旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在 ...

  7. Tomcat的下载、安装、启动与关闭

    ubuntu server 16.04 从官网下载 Binary Distributions 版本的相应的压缩包, https://tomcat.apache.org/download-90.cgi ...

  8. ArrayList、Vector、LinkedList的特点和区别

    ArrayList.Vector.LinkedList类均在java.util包中,均为可伸缩数组. 1)ArrayList和Vector都是基于存储元素的Object[] array来实现的,它们会 ...

  9. DB2序列和主键自增长

    1.把主键定义为自动增长标识符类型 在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值.例如: create table customers(id int a ...

  10. apache反向代理设置

    为了方便在内网测试微信接口API <VirtualHost *:80> ServerName wx.abc.com ProxyPreserveHost on ProxyPass / htt ...