MYSQL数据类型——数值类型

一.数据类型

   定义:是指对数据进行统一的分类,从系统的角度出发是为了使用统一的方式进行管理,管理更好的利用有限空间。

   SQL中将数据类型分成了三大类:数值类型、字符串类型和时间日期类型。

1.数值类型 

数值型数据:都是数值,系统将数值型分为整数型和小数型。

1.1 整数型

存放整型数据:在SQL中因为更多考虑如何节省磁盘空间,所以系统将整型又细分成了5类

1.Tinyint:迷你整型,使用一个字节存储,表示的状态最多为256种,-128~127(常用)。
2.Smallint:小整型,使用2个字节存储,表示的状态最多为65536种。
3.Mediumint:中整型,使用3个字节存储。
4.Int:标准型,使用6个字节存储(常用)。
5.Bigint:大整型,使用8个字节存储。

(a)创建一张整型表:

1 show databases;
2 set names gbk;
3 use my_database;
4 --创建一张整型表:
5 create table my_int(int_1 tinyint,int_2 smallint, int_3 int, int_4  bigint) charset utf8;    

(b)插入数据:

1 insert into my_int values(100,100,100,100); --有效数据
2
insert into my_int values('a','b','199','f'); --无效数据:类型限定 (数据类型不正确) 3 insert into my_int values(255,10000,100000,1000000); --错误:超出范围

注意:SQL中的数值类型全部默认有符号,分正负,有时候需要使用无符号数据,需要给数据类型限定:int unsigned;  --无符号,即从0开始。
(c)给表增加一个无符号类型:
1 Alter table my_int add int_5 tinyint unsigned;  --无符号

注意:查看表结构,发现每个字段的数据类型之后都会自带一个括号,里面有指定的指定的数字;里面带的数字为显示宽度:数据显示的位数,如-123是4位显示宽度(包含符号),255是3位宽度
--显示宽度:没有特别的含义,只是默认的告诉用户可以显示的形式而已,实际上用户是可以控制的,这种控制不会改变数据本身的大小。

1 alter table my_int add int_6 tinyint(1) unsigned;   --指定显示宽度为1
2 insert into my_int values(127,0,0,0,255,255);

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

1 alter table my_int add int_7 tinyint(2) zerofill;  --显示宽度为2,0填充(超过2位不管,低于2位0填充,比如1变为01)

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


1 insert into my_int values(1,1,1,1,1,1,1);
2 insert into my_int values(100,100,100,100,100,100,100);

零填充的意义(显示宽度):保证数据格式。

1.2 小数型
定义:
带有小数点或者范围超出整型的数值类型,在SQL中,将小数型细分成2种:浮点型和定点型。
浮点型:小数点浮动,精度有限,而且会丢失精度。
定点型:小数点固定,精度固定,不会丢失精度。

1.2.1 浮点型

    浮点型数据是一种精度型数据,因为超出指定范围之后,会丢失精度(自动四舍五入)。
    浮点型:理论分为两种精度
     Float:  单精度,占用4个字节存储,精度范围(有效数字范围)大概为7位左右,最小值很小很小,最大值很大很大
   Double: 双精度,占用8个字节存储,精度范围大概为15位左右,最小值很小很小,最大值很大很大。

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

1 CREATE TABLE my_float (f1 float ,f2 float(10,2),f3 float(6,2))charset utf8;  --10位在精度范围之外,6位在精度范围之内,

   (b)插入数据:可以是直接小数,也可以是科学计数法。

1 Insert into my_float values(1000.10,1000.10,1000.10);  --符合条件
2 Insert into my_float values(1234567890,12345678.90,1234.56);  --符合条件
3 insert into my_float values(3e38,3.01e7,1234.56);  --符合条件
4 insert into my_float values(9999999999,99999999.99,9999.99); --最大值  --符合条件

注: 浮点数据的插入,整数部分是不能超出长度的,但是小数部分可以超出长度(系统会自动四舍五入)。

  (c)超出长度插入数据


1 insert into my_float values(123456,1234.123456768,123.9876543);--小数部分超出ok
2 insert into my_float values(123456,1234.12,12345.56);--整数部分超出(f3)

结果:浮点数一定会进行四舍五入(超出精度范围),浮点数如果是因为系统进位导致整数部分超出指定的长度,那么系统也允许成立.

1.2.2  定点型

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

    (a) 创建定点数表:以浮点数作为对比

1 CREATE table my_decimal(f1 float(10,2), d1 decimal(10,2))charset utf8;

     (b) 插入数据

1 insert into my_decimal values(12345678.90,12345678.90);  --有效数据
2 insert into my_decimal values(1234.123456,1234.123456);  --小数部分超出:ok

    (c)查看警告代码

1 show warnings;

      注意: 浮点数如果进位导致长度溢出没有问题,但是定点数不行。

    (d)插入今晚导致超出长度数据


1 insert into my_decimal values(99999999.99,99999999.99); --没有问题
2 insert into my_decimal values(99999999.99,99999999.999); --d1进位超出范围,不行








原文地址:https://www.cnblogs.com/xwxs/p/9144510.html