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学习之路_字段类型与属性的更多相关文章
- mysql学习之路_字段类型与属性2
字段属性: 主键,唯一键,自增长. 主键: Primary key 主要的键,一张表只能有一个字段能使用对应的键,用来唯一约束该字段里面的数据不能重复,称之为主见. 一张表最多只有一个主键. 增加主键 ...
- mysql学习之路_事物_存储过程_备份
数据备份与还原 备份:将当前已有的数据保留. 还原:将已经保留的数据恢复到对应表中 为什么要做数据备份 1,防止数据丢失,被盗,误操作 2,保护数据记录 数据备份还原方式有多种:数据表备份 单表数据备 ...
- mysql学习之路_联合查询与子查询
联合查询 联合查询:将多次查询(多条select语句)在记录上进行拼接(字段不会增加). 语法:多条select语句构成,每条select语句获取的字段必须严格一致(但是字段类型无关). Select ...
- mysql学习之路_外键
回顾4 连接查询: 连接多张表到一起,不管记录数如何,字段数一定会增加. 分类:内连接,外连接.自然连接,交叉连接, 交叉连接:cross join (笛卡尔积) 内连接:inner join,左右两 ...
- mysql学习(四)-字段类型
mysql数据类型: 数值型: 整形:int 浮点型:float double decimal:定点型 日期: date '2012-01-02' time '10:01:01' datetime ...
- mysql学习之路_高级数据操作
关系 将实体与实体的关系,反应到最终数据表的设计上来,将关系分为三种,一对多,多对多,多对多. 所有关系都是表与表之间的关系. 一对一: 一张表的一条记录一定只对应另外一张表的一条记录,反之亦然. 例 ...
- mysql学习之路_基础知识
Mysql php阶段将数据库分为三个阶 基础阶段: mysql数据库的基本操作(增删改查),以及一些高级操作(视图,触发器,函数,存储过程等),PHP操作没有sql数 ...
- mysql学习之路_视图
视图 视图:view是一种有结构的但是没有结构来源的虚拟表,虚拟表的结构来源不是自己定义的而是从对应的基表中产生(来源) 创建视图 基本语法: Create view 视图名字 as select 语 ...
- mysql学习之路_连接查询
回顾 列属性:主键,自增长,唯一键. 关系:一对一,一对多,多对多 三层范式: 1NF:字段设计必须符合原子性 2NF:不存在部分依赖(没有复合主键) 3NF:不存在传递依赖(实体单独成表) 逆规范化 ...
随机推荐
- c#引用命名空间的作用
System 包含用于定义常用值和引用数据类型.事件和事件处理程序.接口.属性和处理异常的基础类和基类.其他类提供支持下列操作的服务:数据类型转换,方法参数操作,数学计算,远程和本地程序调用,应用程序 ...
- tomcat配置的环境变量catalina.home和catalina.base 区别
本篇文章原创地址为:http://blog.csdn.net/you23hai45/article/details/27726147 这两个属性仅在你需要安装多个Tomcat实例而不想安装多个软件备份 ...
- Mysql: Specified key was too long; max key length is 1000 bytes
在使用quartz持久化的时候,笔者使用的mysql,为了以后方便迁移数据,笔者的Mysql默认引擎MyISAM 于是顺理成章的执行了quartz-2.2.3\docs\dbTables\tables ...
- SqlServer添加触发器不让删除数据
触发器是:instead of delete 类型,注意了:instead类型的触发器相当于: DELETE命令过来后,直接走触发器中的代码,再往下,没有了…… 就是说,这个触发器会屏蔽掉你所有的DE ...
- Java 7.35 游戏:猜字游戏(C++&Java)
Ps: 有人可能好奇我为什么大费周章的去写主函数,而不直接把所有操作放在类中,Why?类就好比骨干(存放核心的数据和功能),最好提供接口, 避免了类中的输入输出,当然,这也不是绝对的. C++: #i ...
- PAT 1029 旧键盘(20)(代码)
1029 旧键盘(20)(20 分) 旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在 ...
- Tomcat的下载、安装、启动与关闭
ubuntu server 16.04 从官网下载 Binary Distributions 版本的相应的压缩包, https://tomcat.apache.org/download-90.cgi ...
- ArrayList、Vector、LinkedList的特点和区别
ArrayList.Vector.LinkedList类均在java.util包中,均为可伸缩数组. 1)ArrayList和Vector都是基于存储元素的Object[] array来实现的,它们会 ...
- DB2序列和主键自增长
1.把主键定义为自动增长标识符类型 在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值.例如: create table customers(id int a ...
- apache反向代理设置
为了方便在内网测试微信接口API <VirtualHost *:80> ServerName wx.abc.com ProxyPreserveHost on ProxyPass / htt ...