MySQL (二)

1 数据类型(列类型)

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

MySQL (二)

2 数值类型

  • 数值类型数据:都是数值。
  • 系统将数值型分为整数类型和浮点数类型。

 

2.1 整数类型

  • 在SQL中因为更多的要考虑如何节省磁盘空间,所以系统将整数类型又细分成了5类:
    • tinyint   迷你整型,使用一个字节存储,表示的状态最多为256种。
    • smallint      小整型,使用2个字节存储,表示的状态最多为65536种。
    • mediumint 中整型,使用3个字节存储。
    • int              标准整型,使用4个字节存储。
    • bigint         大整型,使用8个字节存储。  

 

  • 创建一张整型表
create table my_int(
   int_1 tinyint,
   int_2 smallint,
   int_3 mediumint,
   int_4 int,
   int_5 bigint 
)charset utf8;

MySQL (二)

  • 插入数据
-- 插入数据
insert into my_int(int_1,int_2,int_3,int_4,int_5) values(1,2,3,4,5);

MySQL (二)

  • 查看数据
select * from my_int;

MySQL (二)

 

  • SQL中的数值类型全部都是默认有符号的:分正负。
  • 有的时候,需要使用无符号数据,需要给数据类型限定为int unsigned;--无符号

 

  • 给my_int表增加一个无符号类型。
alter table my_int add int_6 int unsigned;

MySQL (二)

  •  插入无符号数据
insert into my_int (int_6) values (0);

MySQL (二)

  • 如果插入的是负数

MySQL (二)

 

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

MySQL (二)

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

 

  • 增加一个int_7 int(1) 的字段
alter table my_int add int_7 int(1) unsigned ;

MySQL (二)

  • 插入数据

MySQL (二)

 

  • 显示宽度的意义:在于当数据不够显示宽度的时候,会自动让数据变成对应的显示宽度,通常需要搭配一个前导0(zerofill:零填充,零填充会导致数值变成无符号)来增加宽度,不改变值大小。
alter table my_int add int_8 int(2) zerofill;

MySQL (二)

 

  • 零填充+显示宽度的效果

MySQL (二)

 

  • 零填充的意义:保证数据格式。

 

3 小数类型

  • 小数型:带有小数点或者范围超出整数类型的数值类型。

 

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

 

3.1 浮点型

  • 浮点型数据会因为超出范围之后,丢失精度(自动四舍五入)。
  • 浮点型:理论上有两种精度。
    • float:单精度,占用4个字节存储数据,精度范围大概在7位左右。
    • double:双精度,占用8个字节存储和数据,精度范围大概在15位左右。  

 

  • 创建浮点数表:浮点的使用方式,直接float表示没有小数部分;float(M,D):M代表总长度,D代表小数部分长度,整数部分长度为M-D。
-- 浮点数表
create table my_float(
    f1 float,
    f2 float(10,2),--10位在精度范围之外
    f3 float(6,2)--6位在精度范围之内
);

MySQL (二)

  • 插入数据:可以直接小数,也可以科学计数法

MySQL (二)

 

3.2 定点型

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

 

4 时间日期类型

MySQL (二)

 

5 字符串类型

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

 

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

 

  • 变长字符串
    • varchar:在分配空间的时候,按照最大的空间分配,但是实际上最终用了多少,是根据具体的数据来确定。
    • varchar(L):L代表length,理论长度是65536个字符,但是会出处1到2个字节来确定存储的实际长度。varchar(10):在utf8环境下,存储10个汉字,需要10 * 3 + 1 = 31 字节。
    • 注意的是,在实际开发中,如果字符的长度超过255个,我们会使用text或blob来代替varchar。  

 

  • 如何选择定长或变长字符串
    • 定长的磁盘空间比较浪费,但是效率高;换言之,如果数据基本上确定长度都一样,就使用定长,如身份证号码,电话号码,手机号码等。
    • 变长的磁盘空间比较节省,但是效率低;换言之,如果数据不能确定长度(不同的数据,长度有变化),如姓名,地址等。  

 

  • 文本字符串
    • 如果数据量非常大,通常超过255个字符,就会使用文本字符串。
    • 文本字符串根据存储的格式进行分类:text和blob。
      • text:存储文字。
      • blob:存储二进制数据(通常不用)。    

 

  • 枚举字符串
    • 枚举:enum,实现将所有可能出现的结果都设计好,实际上存储的数据必须是规定好的数据中的一个。
    • 枚举的使用方式:
      • 定义:enum(可能出现的元素列表);
        • 如:enum('男','女','不男不女','妖')。
      • 使用:存储数据,只能存储上面定义好的数据。          

 

  • 集合字符串
    • 集合和枚举很类似:实际存储的是数值,而不是字符串。
    • 集合的使用元素:
      • 使用:set(元素列表);
      • 使用:可以使用元素列表中的元素(多个),使用逗号分隔。      

 

6 MySQL记录长度

  • MySQL中规定:任何一条记录最长不能超过65535个字节。(varchar永远达不到理论值)

 

7 列属性

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

 

  • 列属性有很多:null/not null;default;primary key;unique key,auto_increment,comment等

 

7.1 空属性

  • 两个值:null(默认的)和not null(不为空)

 

  • 数据库基本上字段默认为null,但是在实际开发的时候,尽可能的要保证所有的数据不应该为null,因为①空数据没有意义,②空数据没有办法参与运算。

 

7.2 描述属性

  • 列描述:comment,描述:没有实际含义,是专门用来描述字段的,会根据表创建语句保存。

 

7.3 默认值

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