MySQL数据类型

所谓的数据类型:对数据进行统一的分类,从系统的 角度出发为了能够使用统一的方式进行管理,更好的利用有限的空间;
SQL中将数据类型分成了三大类:数值类型 字符串类型 时间日期类型

Paste_Image.png

数值类型:都是数值

系统将数值型分为整数型和小数型

整数型

存放整形数据:在sql中考虑到如何节省空间,所以系统将整形有细分了
5类

Paste_Image.png

SQL中的数值类型全部是默认有符号的:分正负
有时候需要使用无符号数据:需要给数据类型限定:int unsigned; --无符号 从0开始
例如:给student表添加一个height字段 类型为tinyint unsigned类型

alter table student add height tinyint unsigned after id;
Paste_Image.png

插入数据
insert into student values(2, 255, 15, 'jim', 78);

Paste_Image.png

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

Paste_Image.png

显示宽度:没有特别含义,只是默认告诉用户可以显示的形式而已,世界上用户是可以控制的,这种控制不会改变数据的本身大小

显示宽度的意义:在于当前数据不够显示宽度的时候,回自动让数据变成显示宽度
,通常需要搭配一个前导0来增加宽度,不改变值大小:zerofill 零填充

小数型

小数型,
SQL中;将小数细分为两种:浮点型和定点型
浮点型:小数点浮动 精度有限 而且会丢失精度
定点型:小数点固定,精度固定 不会丢失精度

####### 浮点型
浮点型数据是一种精度典型数据;以你为超出制定范围之后,会丢失精度(四舍五入)
浮点型:理论分为两种精度
Float:单精度,占用4个字节存储数据,精度范文大概为7位左右
Double:双精度,占用8个字节存储数据,精度范文大概为15位左右

Paste_Image.png

创建浮点数表:浮点的使用方式,直接float表示没有小数部分;float(M,D);M代表总长度,D代表小数部分长度 整数部分长度为M-D;

create table my_float(
  f1 float,
  f2 float(10,2),
  f3 float(6,2)
) charset utf8;

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

Paste_Image.png
时间类型

Datetime:时间日期是YYYY-mm-dd HH:ii:ss;表示的范围是从1000年到9999年,有0值 0000-00-00 00:00:00
Date:日期 就是datetime中的date部分
Time:时间(段),制定某个区间之间,时间到-时间
Timestamp:时间戳,并不是时间错,并不是时间戳,只是从1970年开始的YYYY-mm-dd HH:ii;ss格式与datetime完全一致
Year:年份 两种形式 cc:表示1970到 year(4):1901-2156

Paste_Image.png

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

字符串类型

在MySQL中,将字符串类型分成了6类:char varchar text blob enum set

  • char 定长字符串 磁盘(二维表)在定义结构的时候就已经确定了最终数据的存储长度
    Char(L):L代表;length 可以存储的长度 单位为字符 最大长度的值可以为255
    Char(4): 在UTF8环境下,需要4*3=12个字节
变长字符串

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

Varchar(L);L表示字符长度,理论长度65536个字符,但是会多出1到2个字节来确定存储的实际长度

Varchar(10);的确存了10个汉字,utf8环境,10*3+1 = 31

Paste_Image.png

定长的磁盘空间比较浪费,但是效率高;如果数据基本上确定长度都一样,就使用定长,如:
身份证 电话号码 手机号码等

变成的磁盘空间比较节省,但是效率低; 如果数据不能确定长度(不同数据有变化);如姓名
地址等

文本字符串

如果数据量非常大,通常超过255个字符就会使用文本字符串 分类text 和 blob
Text:存储文字(二进制数据实际都是存储路径)
Blob:存储二进制数据(通常不用)

枚举字符串 enum

事先将所有可能出现的结果都设计好,实际上存储的数据必须是规定好的数据中的一个

枚举的使用方式
定义:enum(可能出现的元素); // 比如:
使用:存储数据,只能存储上面的定义好的数据

create table my_enum(
  gender enum('男', '女', '保密')
) charset utf8;
-- 插入数据
insert into my_enum values('男'), ('保密');

作用二:节省存储空间(枚举通常有一个别名:单选框)枚举实际存储的是数值而不是字符串本身
在mysql中,系统也是自动转成数据格式,而且是基本与PHP一样(尤其是字符串数字)

证明字段存储的数据是数值:将数据取出来+0就可以判断出原来的数据存储存储到底是字符串还是数值:如果是字符串最终结果永远为0,否则就是其他值,
枚举元素实际规律:按照元素出现的顺序,重1开始

列属性

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

列属性有很多: NULL/NOT NULL, default ,Primary key autp_increment, comment

空属性

两个值:NULL(默认的)和NOT NULL(不为空)
虽然默认的,数据库基本都是字段为空 但是实际上在真是开发的时候,尽可能的要保证所有的数据都不应该为空;空数据没有意义,空数据没法参与运算

create table my_class(
  name varchar(10) not null,
  room varchar(10)
) charset utf8;
Paste_Image.png
列描述

列描述:comment 描述 没有实际含义:是专门用来描述字段,会根据表创建语句保存;用来给程序员(数据库管理员)进行了解的。

create table my_teacher(
  name varchar(20)  not null comment  '姓名',
  money decimal(10, 2) comment  '工资'
) charset utf8;
Paste_Image.png
默认值

默认值:某一种数据会经常性的出现某个具体的值,可以一开始就制定好,在需要真实数据结构,用户可以选择性的使用默认值
默认值关键之:default

create table my_default(
  name varchar(20) not null,
  age tinyint unsigned default 0,
  gender enum('男', '女', '保密') default '男'
)charset utf8;
Paste_Image.png
主键

主键:primary key 一张表中只能有一个字段可以使用对应的键,用来唯一的约束该字段里面的数据,不能重复:这种称之为主键

一张表中只能最多有一个主键
主键默认不能为空

  • 增加主键
    SQL操作有多中方式可以给表增加主键:大体分为三种
    方案1:在创建表的时候,直接在在字段之后,跟上primary key关键字
create table my_pril(
  name varchar(20) not null comment '姓名',
  number char(10) primary key comment '学号:'
) charset utf8;
Paste_Image.png

方案2:在创建表得时候,在所有的字段之后,使用primary key(主键字段列表)来创建主键(如果有多个字段作为主键,可以是复合主键)

create table my_pri2(
   number char(10) comment '学号',
   course char(10) comment '课程代码',
  score tinyint unsigned default 60 comment '成绩',
-- 增加主键限制:学号和 课程应该是个对应的,具有唯一性
  primary key (number, course)(复合主键)
)charset  utf8;

方案3;当表已经创建好了之后,再次额外追加主键,可以通过修改字段属性,也可以直接追加

Alter table 表名 add primary key(字段列表);
create table my_pri3(
  course char(10) not null comment '课程编号',
  name carchar(10) not null comment '课程名字'
) charset utf8;

追加主键
alter table my_pri3  modify course char(10) primary key comment '课程名字';
alter table my_pri3 add primary key (course);
Paste_Image.png
主键约束

主键对应的字段

  • 更新主键&& 删除主键
Alter table 表名 drop primary key;
Paste_Image.png
  • 主键的分类
    实际创建表的过程中,我们很少使用真实的业务数据作为主键字段(业务主键);
    大部分的时候是使用逻辑性的字段(字段没有业务含义,值是什么都没有关系),将这种字段称之为逻辑主键
Create table my_student(
  id int primary key auto_increment ‘逻辑主键,自增长’,
  Number char(10) not null comment ‘学号’,
  name carchar(10) not null
);
  • 自动增长
    自增长:当前对应的字段,不给值,或者说给默认值,或者给NULL的时候,会自动的被系统触发,系统会从当前字段中已有的最大值进行+1操作,得到一个新的在不同字段

自增长通常跟主键搭配
自增长特点: auto_increment
1.任何一个字段要做自增长要做自增长必须前提本身就是一个索引(key -栏有值)
2.自增长必须是数字(增长)
3.一张表最多有一个主键

  • 自增长的使用
    当自增被给定的值为NULL 或者默认值得时候,会触发自动增长

自增长 如果对应的字段输入了值,那么自增长失效:但是下一次还是能够正确的自增长(从最大值+1)

如何确定下一次是什么自增长恩?可以通过查看表创建语句看到;

Paste_Image.png
  • 修改自增长
    1.自增长如果是涉及到字段改变,必须先删除自增长后增加(一个表只能有一个自增长)
    2.修改当前自增长已经存在的值:修改只能比当前已有的自增长的最大值大(小不生效
alter table 表名 auto_increment = 值;

思考:为什么自增长从1开始?为什么每次都是自增1呢?
所有的系统表现(如字符集,校队集)都是有系统内部的变量进行控制的

show variables like 'auto_increment%';

Paste_Image.png
  • 删除自增长
    自增长是字段的一个属性:可以通过modify来修改(保证字段没有auto_crement即可)
Alter table 表名 modify 字段 类型;
Paste_Image.png
唯一键

一张表中往往有很多字段需要具有唯一性,数据不能重复:但是一张表中只能有一个主键:(unique key) 就可以解决多个字段需要唯一性约束的问题;

唯一键的本质与主键差不多:唯一键默认的允许自动为空,而且可以多个为空(空字段不参与唯一性比较)

  • 增加唯一键
    基本与主键差不多
    方案1:在创建表的时候直接跟unique、unique key
create table my_unique1(
  number char(10) unique comment ‘学号唯一,允许为空’,
  name varchar(10) not null 
) charset utf8;

方案2.在所有的字段之后增加unique key(字段列表); --复合唯一键

方案3.在创建表之后增加唯一键

create table my_unique3(
    id int primary key auto_increment,
    number char(10) not null,
    name varchar(20) not null 
)charset utf8;
追加唯一键
alter table my_unique3 add unique key(number);

如果唯一键也不允许为空:与主键的作用是一致的

  • 更新唯一键 &&删除唯一键
    更新唯一键:先删除 后新增(唯一键可以有多个,可以不删除)
alter table 表名 drop unique key; -- 错误的  因为唯一键有多个

Alter table 表名 drop index 索引名字;

Paste_Image.png
索引

几乎所有的都是建立在字段之上
索引:系统根据某种算法,将已有的数据(未来可能新增的数据),单独建立一个文件,文件能够实现快速匹配,并且能够快速找到对应表中的记录;

索引的意义:
1.提升查询数据的效率
2.约束数据的有效性(唯一性等)

增加索引的前提条件:索引本身会产生索引文件(有时候可能比数据文件还大),会消耗磁盘空间

如果某个字段需要`作为查询条件`经常使用,那么可以使用索引(一定想办法增加);
若果某个字段需要进行数据有效的约束,也可能使用索引(主键,唯一键)

MySQL中提供了多重索引
1.主键索引:primary key
2.唯一键索引: unique key
3.全文索引: fulltext index
4.普通索引: index

全文索引:针对文章内部的关键字进行索引
全文索引最大的问题:在于如何确定关键字

英文和容易:英文单词之间与打次之间有空格
中文很难: 没有空格, 而且中文可以各种随意组合(分词 sphinx)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容