mysql学习笔记----数据类型,属性,约束

时间:2022-09-21 11:36:50

mysql的数据类型,列类型,字段类型

三大类:数值,字符串,日期时间。

数值

  • 整数int
    int占4字节,其他占用空间情况:
    mysql学习笔记----数据类型,属性,约束
    如何选择:通过叶无逻辑判断,常见tinyint,int。

    mysql的整形,有php整形不具备的概念:
    无符号:只能表示整形或者0。那么最大的整数会很大。
    默认是有符号的,可通过整形的unsigned选项,int unsigned设置整形无符号。
    显示宽度:显示宽度,不决定整型的范围。而决定在显示出该数之后,如果宽度不够,则采用前导零不齐!此时需要额外的属性 zerofill 来设置!

    mysql中,没有布尔型!但是存在Boolean这个关键字,表示 tinyint(1)。典型的,0表示假,1表示真。

  • 浮点数float double
    单精度,float,4字节;
    双精度,double,8字节。
    在定义浮点数,典型的需要指明其有效位数,和小数位数
    float(M,D)
    double(M,D)
    M:所有的有效位数
    D:其中的小数位数
    以上两个值,决定一个浮点数的有效范围!

  • 定点数 decimal
    小数点是固定的,decimal与定义浮点数一致,也有有效位数与小数位数的概念。
    decimal(M,D);
    存储形式不是数值的形式存储,类似于字符串的形式存储。
    注意:关于小数,
    1.支持科学计数法;
    2.支持unsigned无符号数;
    3.支持zerofill。

字符串类型

  • char
    最基本(定长)的字符串类型,用于保存长度固定的内容,速度快,但是保存变长数据会浪费空间
  • varchar
    可变长度的字符串,用于保存长度可变的数据,保存变成数据时,节省空间处理起来麻烦些

    char(L),varchar(L)
    L,表示每个数据的最大长度!单位是字符数(不是字节数)

    L的值不是多大都可以!
    有最大值:
    1,mysql一条记录最大不能超过65535个字节!(字段的长度加起来,不能超过这个值)
    2,长度单位是字符数,与编码是相关的!
    utf8编码最大为21845,gbk为32767

    在使用时,varchar 超过255就选择 text来保存!

  • text
    文本,不限长度的字符串,不需要制定长度,而且也不会算入到记录的总长度内。

    选择
    定长:char;
    边长较短(255)个字符内:carchar;
    变长,较长:text。

  • 枚举,enum,单选
    需要在定义枚举类型是,列出哪些是可能的。

    create table type_enum_1(
    gender enum('male','female','secret')--insert的值只能三选一
    );

    处理时类似字符串类型操作。

    意义
    1.限定性的可能性;
    2.速度快,比普通的字符串速度快;原因是枚举型是利用整数进行管理的,能2个字节进行管理;
    每个值都是一个整数标识,从第一个选项开始为1,逐一递增,管理时整数的形式,速度比字符串快。
    2 个字节,0-65535,因此可以有 65535个选项可以使用!

  • 集合,set,复选
    类似于枚举,定义时也需要指定其已有值。
    与字符串相比,优势是:
    1.也是采用整数进行管理的,采用位运算,从第一位开始为1,注意x2;

    create table type_set_1(
    hobby set('male','female','secret','other')
    );
    -- 1 2 4 8_1000

    2.每个集合类型8个字节64位,因此可以表示64个元素

    注意:站在mysql的角度,尽量多用枚举和集合,站在php操作mysql的角度,尽量少用,兼容性差。

日期时间

  • datetime

    用于保存大范围的日期时间,’1000-01-01 00:00:00’到’9999-12-31 23:59:59’
    在处理时是使用字符串的形式进行管理。

  • timestamp
    时间戳,管理常用的典型时间,从1970-1-1开始。空间少,而且是以整形的形式管理,但是一个字符串的形式展示出来的。

  • date
    日期,如果只记录日期,不记录时间,采用date。

  • year
    在保存年份的时候,采用一个字节保存,因此只能表示1901–2155年。

  • time
    时间,时间时刻。还可以表示时间跨度时间段的概念。

    总结
    1.除了time,都是时间点的概念,time还表示时间跨度。
    2.年份的表示:
    可以采用2位年份 0-69表示20xx 70-99表示19xx
    3.除了-还有:可以作为日期和时间的分隔符外还有很多其他字符都可以。

在PHP程序中:小范围的日期使用整形,大范围的日期使用字符串。

列属性

  • NULL,not null属性空约束
    mysql的NULL不是属性,也不是类型,只是标识属性,用于说明某个字段是够以为null(是否可以什么都不存)。
    NULL采用关键字NULL表示(不是字符串)。
    如果,在添加数据时,没有指定值,也可能会是NULL。
  • default属性,默认值约束
    采用 default 关键字,来限定一个字段的默认值,在没有指定字段数据时,采用默认值。
    default 与 null 的处理关系:
    如果此时,该字段被指定了一个null:不能使用默认值,允许为null则为null,不允许则插入失败。
    如果一个字段没有指定默认值,那么默认为NULL。
    应用
    典型在很多表上增加一个 update_time 将其默认值设置成 current_timestamp。就可以记录下当前记录的最后操作时间。
create table default(
id int not null,
birthday timestamp default current_timestamp
);

字段约束

  • 主键约束/唯一约束,primary unique
    都是索引的一种。
    主键:可以唯一标识记录的字段,称之为主键;
    唯一:保证在某个字段上的数据是唯一的,可以设置为唯一约束;
    一个表中只能有一个主键,可以有多个唯一约束。
    典型的,在创建表时,主动增加一个非实体的自然属性,充当主键,采用整型,运算速度快。
    mysql学习笔记----数据类型,属性,约束
  • 主键建立:两套方案;

    create table primary_1(
    id int primary key, --在前添加
    name varchar(10)
    );


    create table primary_2(
    id int ,
    name varchar(10),
    primary key (id) --在后添加
    );

    一旦创建了主键,就不能为空。

  • 唯一建立
    使用unique key来创建

    create table unique_1(
    id int primary key,
    name varchar(10) unique key --在前添加
    );


    create table unique_2(
    id int ,
    name varchar(10),
    primary key (id),
    unique key (name) --在后添加
    );

    注意:主键或者是唯一,都可以由多个字段组成。
    因此,主键与字段的概念:字段来充当主键,不是字段就是主键!(称之为复合主键)尽量采用 id 一个来作为主键。

  • 管理主键/唯一

    • 删除主键
      alter table 表名 drop primary key;

    • 添加主键
      alter table 表名 add primary key(‘字段列名’);

    • 删除唯一
      alter table 表名 drop index 索引名字(字段列表);
      索引的名字可以通过show create table 看到;

    • 增加唯一
      alter table 表名 add unique key 索引名字(字段列表);
  • 自动增长auto_increment
    用于主键,只有一个字段主键,才能使用auto_increment,从1开始逐一递增。
    目的是保证唯一,计算方便。
    注意:unsigned不是列属性,是类型的一部分(包括zerofill)因此位置上与类型在一起。
    下面写法不正确
    id int auto_increment unsigned primery key,
    —-unsigned应放于int后,属于属性部分

  • 注释,comment

注意

哪些地方可以设置编码?
1.建表,建库,建字段时可以设置编码(数据库中的数据的编码);
2.PHP作为mysql服务器的客户端,设置的客户端编码和连接编码(set names);
3.设置PHP返回给浏览器数据的编码(Content-Type,header(),《meta标签》);
4.PHP文件本身保存的编码(文件编码,通过文本编辑器设置)。

浏览器查看时可以强制制定编码。