数据库(2)——数据类型及表的约束

数据类型及表的约束

一、数据类型

  

下面我将对以下几种类型进行分析:

1、数值类型

(1)bit的使用

bit[(m)]:m可以不写,默认值为1m的范围:0-64.bitASCII码的形式展示,所有我们可以遇到不可见字符。

案例:将name属性设置为bit1),则其所能容纳的只有01,我们采用临界值比较法对其进行验证,结果如下。

          

                    

(2)tinyint的使用

tinyint[unsigned]默认为带符号的,表示范围:-128-127,若为无符号则范围为:0-255.

案例(1):验证tinyint的默认范围及默认是否带符号。

由下述结果,我们可以得出tinyint默认范围为:-128-127,且为带符号。

         

案例(2):验证tinyint unsigned的范围

由以下结果可以得出,无符号的tinyint范围为:0-255.

           

(3)float的使用

float[(m,d)]m指定显示的长度,d为指定显示小数位的长度。且float也可以指定为无符号(unsigned.

案例:设置salary6,2)进行验证。

分析salary表示的最大范围:-9999.99-9999.99

通过以下结果,可以发现,当指定长度时,若超过范围则无法插入成功,且MySQL在保存值时采用四舍五入的方式。

      

(4)decimal的使用

decimal(m,d):m为指定显示的长度,d为指定显示小数位数的长度。m被省略默认为10d被省略默认为0.

decimalfloat很相似,不同之处就是表示的精度不一样,decimal表示的精度比较大,float表示的精度大概为7位,而decimal整数位数最大为65位,小数位数最大为30位。

      

由上图我们可以看出floatdecimal的精度不同,decimal的精度比较大,若我们希望小数的精度高时就采用decimal

文本、二进制类型

(1)char的使用

     charL):固定长度字符串,L表示可存长度,单位:字符。最大255个字符。

(2)varchar的使用

varcharL:可变长度字符串,L表示字符长度,最大长度为65535个字节。与字符集的设置有关。

uft8:一个字符三个字节。

gb2312:一个字符两个字节。

     

案例:charvarchar的使用

     

charvarchar的区别:

存储空间比较:

实际存储

char4

Varchar(4)

char占用字节

varchar占用字节

Abcd

Abcd

Abcd

4*3=12

4*3+1=13

a

a

a

4*3=12

1*3+1=4

Abcde

×

×

数据超过长度

数据超过长度

char:定长,会造成空间浪费,但效率高。

varchar:变长,节省空间,效率相对较低。

3、时间日期类型

(1)datatime:时间日期格式,“yyyy-mm-dd HH-ii-ss”占八个字节

(2)data:日期格式,“yyyy-mm-dd”占三个字节

(3)timestamp:时间戳,与datatime格式相同“yyyy-mm-dd HH-ii-ss”,占四个字节。会自动修改为当前的数据,只要对表中任意数据进行修改时间戳都会改为最后修改的时间。

插入数据时,时间戳会自动填补为当前时间。

  

修改数据:修改数据时,时间戳会更新为当前时间。

        

4、String类型

(1)枚举enum

enum('选项1','选项2','选项3',...);enum其实就是“单选”类型,对应界面或表单中的“单选项”的数据值。

该设定只是提供了若干个选项的值,终一个单元格中,实际只存储了其中一个值;而且,处于效率考虑,这些值 实际存储的是“数字”,因为这些选项,每个选项值,一次对应如下数字:1,2,3,....65535个。

(2)集合set

set('选项值1','选项值2','选项值3', ...);set就是“多选”类型,对应于界面或表单的“多选项”的数据值。

该设定只是提供了若干个选项的值,终一个单元格中,设计可存储了任何其中的多个值;而且,处于效率考虑, 这些实际存储的是“数字”,因为这些选项,每个选项值,一次对应如下数字:1,2,4,8,16,32....64个。

        

通过插入操作发现,我们只可以插入我们创建表时定义的数据,而不能插入定义之外的数据。

我们在对表中的数据进行查询:

        

由此我们可以得出在对枚举进行查询时可使用我们之前使用的select * from 表名 where 满足条件的子句,而对集合进行数据查询时要使用find_in_set来进行查询,否则查询不到正确的结果。

二、表的约束

真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。

(1)空属性

两个值:nullnot null,数据库默认字段基本都是为空(null),但在实际中,我们尽可能使之不为空,因为无法参加运算。

案例:创建一个表,包含学号和姓名,且都不为空,因为没有学号不知道姓名,没有姓名也不会知道学号(排除同名问题)。

      

插入元素时若插入空元素则会插入不成功:

          

(2)默认值

默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。Setenum不能指定默认值。

     

当数据在插入时不给定字段的值则是默认值就生效。

      

(3)列描述

列描述:comment,没有实际含义,用来描述字段表示的含义,会根据表创建语句保存,用来给程序员或DBA来进行了解。

     

通过show我们可以看出列描述:

     

(4)Zerofill格式化

其实在不加zerofill的时候,int10)中的10是没有任何意义的,而在加了zerofill后,则显示的10位不够10位的用0补齐。

   

同样插入10,而看到num1的值是0000000010,而num2的值时是10,这就是zeroll属性的作用,如果宽度小于设定的宽度(这里设置的是10),自动填充0。要注意的是,这只是后显示的结果,在MySQL中实际存储的还是10。为什么是这样呢?我们可以用hex函数来证明。

                     

(5)主键

主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,主键所在的列是整数类型;一张表中多只能有一个主键。

定义主键的三种方式:

1)创建表的时候直接在字段上指定主键

          

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

    

复合主键:

     

3)当表创建好以后,可以再次追加主键

      

删除主键:alter table 表名 drop primary key不需要指定主键的字段,因为主键是唯一的。

               

(6)自增长

auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。

特点:任何一个字段要做自增长,前提是本身是一个索引(key一栏有值) 自增长字段必须是整数 一张表多只能有一个自增长。

    

以下实例可以表明自增长只增不长,不会因为删除数据自增长的值而减小。

                    

(7)唯一键

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

唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。

               



















猜你喜欢

转载自blog.csdn.net/qq_40409115/article/details/80517717