打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
PHP教程(9)校对集+mysql数据类型+数据长度限制+列属性(null+默认值+主键+自增长)
userphoto

2022.07.17 广东

关注
回顾
数据库基础知识,关系型数据库(行/记录,列/字段,SQL)
基本SQL操作:库操作,表操作(字段)和数据操作
字符集
校对集
1.      什么是校对集?
校对集就是指在同样的字符集下的数据按照什么样的方式进行比较,比较的规范的集合就叫校对集。
校对集分类
_bin:二进制比较,区分大小写的
_ci:case insensitive,大小写不敏感,不区分大小写
_cs:case sensitive,大小写敏感,区分大小写
查看数据库所支持的校对集有哪些
show collation;
一共有197种校对集
校对集的实现:在创建数据表(库)的时候指定校对集:collate = 校对集
插入数据
校对集的使用:在需要对数据进行比较的时候会自动的启用
对数据进行排序的时候一定会用到校对集。
语法:在where条件之后,使用order by 要排序的字段 [asc|desc]
asc:升序,是默认的
desc:降序
虽然中文也可以比较,但是没有比较的意义,gbk支持中文比较,utf8不支持,gbk比较的并不是中文本身,只能比拼音。
结论:一张表的校对集应该在创建表的时候就指定,而不能在表已经存在的情况下(数据)再去尝试修改校对集,修改无效。
乱码问题解决
出现乱码的原因:两个数据存在的字符集不一致。
理想的解决方案:三码合一
存储引擎
mysql提供了很多的存储引擎可以选择,但是常用的是myisam和InnoDB,因为这两个免费。
全部存储引擎
5.5以前的存储引擎默认的是myisam,5.5之后都是InnoDB了。
甲骨文收购sun之后得到mysql就不再对myisam存储引擎进行技术支持,把所有团队都用来支持InnoDB
InnoDB和myisam区别
1.      文件的存储形式不一样
2.      myisam的批量插入和查询效率高,而InnoDB的修改和删除效率高
3.      事务安全只有InnoDB支持,myisam不支持
4.      InnoDB支持外键,myisam不支持
字段(列)类型
1.      什么是字段类型?
所谓的字段类型指的是当前字段所能存储的数据的类型
SQL语言是一种强类型语言,所以必须在表创建的时候,给字段指定对应的数据类型,而且在数据存储的时候,只能存储的指定的数据类型。
数据类型分类
在SQL中,数据类型同样分为三类:数值型,字符串型,日期时间型
数值型:整型,小数型(浮点型和定点型)
字符串型:定长,不定长,文本,集合,枚举
日期时间型:时间日期,日期,时间,年,时间戳
s
数值型
整型
存放整数的数据类型。生活中有不同的需求来使用不同范围内的整型,而SQL就需要根据不同的需求来设定不同的整型(分配不同内存)来记录,提高空间的利用率。
整型分为以下五种
tinyint:迷你整型,1一个字节存储,最多256个数据
smallint:小整型,2个字节存储,最多65536个数据
mediumint:中整型,3个字节存储
int:标准整型,4个字节存储
bigint:大整型,8个字节存储
创建整形表
插入数据
在SQL中,数值数据默认的都是有符号的,所以有正负之分,应该将数据一分为二
类型
字节
最小值(有符号/无符号)
最大值(有符号/无符号)
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
无符号
语法:在数据类型之后,使用unsigned关键字
查看数据结构
要做到不改变原来数值大小的情况下,只能在数据的左边进行0填充
默认的系统不会自动的使用0填充,需要根据指令进行0填充,zerofill
语法:数据类型之后 zerofill
效果
显示宽度注意事项
小数型
浮点型:有可能丢失精度的小数型
float:单精度浮点型,7个精确值左右
double:双精度浮点型,15位左右
浮点型使用语法
字段float/float(M,D)
M表示整个长度,D表示小数部分的长度
创建表
插入数据
浮点数数据查询:系统会自动丢失精度之后的所有数据,四舍五入
浮点数的应用:如果数据量特别大但是对精度要求不高的数据才会使用浮点型。
定点型
在指定范围内不会丢失精度的小数。
语法:decimal(M,D),M总长度,D小数部分长度
定点型应用
字符串类型
字符串类型分为:定长字符串,变长字符串,文本字符串,集合字符串和枚举类型
定长字符串
定长指的是磁盘所分配的空间是固定长度的存储空间,但是里面存储的数据可以没有空间长。
定长:char
语法:字段名char(L),L表示可以存储的字符长度,定长的L长度最大值是255
变长字符串
变长指的是磁盘会根据实际存储的内容来进行磁盘空间的分配。
变长:varchar
语法:字段名varchar(L),L表示可以存储的字符长度,L的最大值理论上是65535,因为varchar是变长,所以真实存储的数据的长度不可得知,所以任何变长数据都需要开辟额外的1或2个字节来存储数据的长度。
定长与变长对比:utf8
字符串
Char(4)
Varchar(4)
Char实际字节长度
Varchar实际字节长度
A
A
A
4 * 3(utf8) = 12
1 * 3(utf8) + 1 = 4
ABCD
ABCD
ABCD
4 * 3(utf8) = 12
4 * 3(utf8) + 1 = 13
定长和变长的应用
1.      长度固定的较小的字符串使用定长,手机号,身份证,md5加密等
2.      长度不固定的较小的字符串使用变长,姓名,籍贯,家庭住址等
3.      如果字符串长度较长(通常超过255个字符)使用文件字符串
定长与变长的优劣
1.      定长:浪费空间,但是读取效率高
2.      变长:节省空间,但是效率降低
在wamp中,mysql使用的精简模式,不是使用严格模式来约束数据,但是独立安装的mysql使用的严格模式。
区别
1.      错误处理方式不一样:精简模式下,如果出现错误,系统会尝试去减少错误代价(数据太长进行截取),在严格模式下,直接报错。
2.      对于空字符串的处理不一样:主键自增长的时候
文本字符串
文本字符串分为两种:字符型文本,二进制文本
文本字符串:text
二进制字符串:blob
图片或者文件等都可以进行存储,但是不建议直接存储,而是存储对应的文件的位置(路径)
一般认为超过255个字符的数据都使用文本字符串来进行存储。
枚举字符串
枚举字符串指的是在定义之初就确定要存放的字符串有哪些,然后在数据进行存储的时候就只能存储已经定义过的字符串,只能使用任意的一个字符串。(单选框)
语法:enum
字段名enum(字符串1,字符串2,…);   枚举采用最多2个字节保存数据,最多能存65535个数据
枚举的意义
1.      规范数据:没有进行维护的数据不能插入
2.      节省空间:实际存储的数据是数字
虽然SQL是一种强类型语言,但是SQL能够自动转换数据类型(与php一样)
select有一个特点:后面可以跟任意表达式
证明枚举存储的是数字
枚举的字符串与数值的关系
因为枚举内部真实存储的数值,因此枚举可以通过数值进行数据插入。
枚举存储原理
枚举的应用
1.      固定的不变的,但是具有多个值的数据可以使用枚举
集合字符串
集合字符串与枚举字符串大致一致,但是集合数据指的是可以选中定义的值中间的部分数据或者全部数据。多选
语法:set
字段名set(字符串1,字符串2,…);
集合中的数据,每一个数据都是占用一个字节中的一个位来进行表示,然后保存是数值却是所有的位共同转换成十进制显示
数据在集合中占位的原理
换算的时候需要将二进制颠倒过来,然后进行换算成十进制。
set最多占用8个字节存储数据:8个字节共64位,最多集合只能存放64个元素,但是组合却有2^64之多。
集合的意义
1.      规范了数据,只能存储定义过的数据
2.      节省了空间
虽然集合和枚举都能够为数据库节省空间,并且能够规范数据,但是作为php程序员,增加了php维护数据的难度,所以php程序员基本上不使用这两种数据类型。
时间日期类型
SQL中用来存储时间或者日期的数据类型
类型
显示格式
取值
存储空间
零值
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:日期时间,8个字节存储
timestamp:时间戳,使用标准整型存储,不是整型数据,而是与datetime格式一样的数据
date:datetime的日期部分
time:datetime的时间部分,time表示的不是时间点,是时间段
year:年份,1个字节存储,只能表示255年
时间格式:表示时间段
作为php程序员,基本上不适用SQL的任何时间格式,都是使用php的时间戳
在mysql中,任意一条记录的长度不能超过65535个字节。
varchar的理论数据长度是65535个字符
GBK/UTF8编码最大的varchar长度
在SQL中,所有的字段只要有一个字段允许为空,那么整条记录就需要留出一个字节用来保存null,如果有多个字段为空,也只需要一个字节。
text文本类型不占用记录的总长度,是额外开辟空间的存储数据,但是text字段本身要占据一定的数据长度(10个字节)
列属性
除了数据类型对列进行数据规范之外,还有一些额外的限制对字段进行约束。
列属性:NULL/notnull,default,primary key,auto_increment,comment,unique key
NULL
字段是否允许为空,不允许为空就是not null。
语法:字段名 数据类型 NULL/NOT NULL,默认的是null
默认值
关键字default,在定义结构的时候,如果字段没有被指定数据,那么系统会使用默认的数据来进行数据填充。
默认值的使用
1.      要使用默认值,不对该字段进行数据插入(字段列表不能出现对应的字段)
2.      要使用默认值,可以在数据值插入的位置使用default关键字
主键
主要的键,用主键修饰的字段,不能为null,也不能出现任意数据的重复。能够唯一的标识出一条记录。一张表只能有一个主键。
添加主键:
1.      在要做主键的字段之后添加primarykey关键字
2.      在所有的字段之后,指定主键,可以指定复合主键(多字段主键)
语法:primarykey(字段列表)
3.      假设表已经存在了,但是需要增加主键,可以通过修改表的结构来增加主键:必须实现保证该字段的数据没有重复。
a)        修改字段,给字段增加primarykey属性
b)        可以直接通过修改表结构增加主键(复合主键)
主要的效果:具有唯一性,不能插入重复的数据
主键不能修改,但是可以删除
语法:修改表结构
alter table 表名 drop primary key;
自增长
auto_increment,当某个字段有了自增长属性之后,如果改字段在进行数据新增的时候,没有指定数据,那么系统会自动在原有的基础上自动+1,说明字段类型必须是整型。
自动增长通常是搭配主键使用
自增长的应用
1.      不为当前字段赋值
2.      可以为自动增长字段使用null/default关键字显示的调用
自动增长之所以能够填充对应的数据,是因为在表的选项中已经指定好对应的值了
修改自动增长:修改自动增长下一个子增长值,但是修改的值只能比当前已有的数据的值要大,而不能小。
alter table 表名 auto_increment = 值
效果
删除自增长
alter table 表名 modify 字段不再增加auto_increment属性;
auto_increment往往搭配主键:删除主键
想要删除有自动增长的主键,必须先删除自动增长再删除主键。
自增长控制:初始值和步长
show variables like 'auto_increment%’;
注意:一张表只能有一个自增长。
修改步长
set auto_increment_increment = 2;
效果
这种修改是针对当前用户当前连接有效(会话级别)
作业:
1.      制作一个教学管理系统的数据库:学生,班级,老师等,根据不同的数据的需求确定对应的属性和数据类型
2.      制作小网站:教学管理系统
a)        登录验证,查看所有的学生信息
b)        老师能够查看所有的信息
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
MySQL数据库基础:数据类型及列类型
第二天
mysql数据类型
全网最全的 MySQL 索引优化方案
表相关
关于MySQL中的char与varchar的区别
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服