精华内容
下载资源
问答
  • MySql 数据类型 - 小数
    2020-11-24 14:40:48
    • 小数类型分为 浮点小数定点小数

    • 浮点小数

      • 浮点小数是“不精确的小数”,包括 floatdouble
        float:占用4字节存储空间,可称为“单精度浮点数”,约7位有效数字。
        double:占用8字节存储空间,可称为“双精度浮点数”,约17位有效数字。

    • 定点小数

      • 浮点小数是“精确的小数”一一它通过内部技巧,突破了“有些小数无法用二进制精确表示”的局限。
      • 其设定方式通常是这样的: decimal(M, D);
        其中M表示该小数总位数(包含小数点前后部分,最大长度65),D表示该小数的小数点后的位数。

    • 使用效果

      定义三个字段分别为 float、double 和 decimal 类型,并都插入数字 123456789.123456789123456789 显示结果,注意三者保留数值精度也不一样。

      mysql> desc user;
      +-------+----------------+------+-----+---------+-------+
      | Field | Type           | Null | Key | Default | Extra |
      +-------+----------------+------+-----+---------+-------+
      | x1    | float          | YES  |     | NULL    |       |
      | x2    | double         | YES  |     | NULL    |       |
      | x3    | decimal(23,14) | YES  |     | NULL    |       |
      +-------+----------------+------+-----+---------+-------+
      mysql> insert into user (x1, x2, x3) values (123456789.123456789123456789, 123456789.123456789123456789, 123456789.123456789123456789);
      mysql> select * from user;
      +-----------+--------------------+--------------------------+
      | x1        | x2                 | x3                       |
      +-----------+--------------------+--------------------------+
      | 123457000 | 123456789.12345679 | 123456789.12345678912346 |
      +-----------+--------------------+--------------------------+
      
    更多相关内容
  • 存储带小数类型 浮点数和定点数类型来存储带小数的数值; 使用(M,D)的方式设定M的精度(或显示的总位数)和D标度(小数的位数)。

    本篇文章MySQL版本:

    +-----------+
    | version() |
    +-----------+
    | 5.5.53    |
    +-----------+

    存储带小数的类型

    • 浮点数和定点数类型来存储带小数的数值;
    • 使用(M,D)的方式设定M的精度(或显示的总位数)和D标度(小数的位数)。

    FLOAT

    正常格式

    创建一个长度为3,小数点之后长度为2的单精度浮点型字段:

    mysql> create table t8 (
        -> col1 float(3,2)
        -> );
    Query OK, 0 rows affected (0.01 sec)
    

    插入一条正常数据:

    mysql> insert into t8 values (3.33);
    Query OK, 1 row affected (0.00 sec)

    插入一条小数点后面只有一位的数据:

    mysql> insert into t8 values (3.3);
    Query OK, 1 row affected (0.00 sec)

    插入一条小数点后面大于指定的长度的数据:

    mysql> insert into t8 values (3.333);
    Query OK, 1 row affected (0.00 sec)

    插入一条小数点后面大于指定长度的数据(四舍五入):

    mysql> insert into t8 values (3.336);
    Query OK, 1 row affected (0.00 sec)

    查询:

    mysql> select * from t8;
    +------+
    | col1 |
    +------+
    | 3.33 |
    | 3.30 |
    | 3.33 |
    | 3.34 |
    +------+
    4 rows in set (0.00 sec)

    错误用法

    插入一条整数长度为2,小数长度为1的数据:

    mysql> insert into t8 values(33.3);
    Query OK, 1 row affected, 1 warning (0.00 sec)

    总长度为3,小数点后面为1,都没有超过规则。但是执行完,返回 一个警告。

    看一下结果:

    mysql> select * from t8;
    +------+
    | col1 |
    +------+
    | 3.33 |
    | 3.30 |
    | 3.33 |
    | 3.34 |
    | 9.99 |
    +------+
    5 rows in set (0.00 sec)

    不同版本返回结果不同

    • 5.6会提示报错,提示 超出长度范围,是违法数据,原因也就是说默认设置长度为3,小数长度为2,所以插入33.3就等于插入了33.30,超出总长度报错;
    • 5.5版本可以正常插入,但是只能插入最大值,也就是 整型1位,小数2位。

    DOUBLE

    double和float用法大同小异,只是范围广一点,不再做多余陈述;

    DECIMAL

    mysql> help DECIMAL;
    Name: 'DECIMAL'
    Description:
    DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
    • The maximum number of digits (M) for DECIMAL is 65.
    • The maximum number of supported decimals (D) is 30.
    • If D is omitted,the default is 0.
    • If M is omitted, the default is 10.
    展开全文
  • MySQL小数数据类型

    千次阅读 2020-06-14 20:26:19
    单精度(只能精确到小数位7位)的浮点(小数)数据类型 float(M,D) unsigned zerofill# M最大255位,含小数30位# D最大30位 4 double 单精度(只能精确到小数位15位)的浮点(小数)数据类型 double(M,D) unsigned zerofill...

    第1章 小数类型和测试环境说明

    1.1 小数数据类型有哪些

    从官方网站上看

    https://dev.mysql.com/doc/refman/5.7/en/numeric-types.html

    1

    自己整理的

    类型说明格式占用存储(字节bytes)
    float近似值(浮点)小数数据类型,小数位只能精确到7位float(M,D) unsigned zerofill
    # M最大255位,含小数30位
    # D最大30位
    4
    double近似值(浮点)小数数据类型,小数位只能精确到15位double(M,D) unsigned zerofill
    # M最大255位,含小数30位
    # D最大30位
    8
    decimal准确值(定点)小数数据类型,小数位完全精确decimal(M,D) unsigned zerofill
    # M最大65位,含小数30位
    # D最大30位
    每个小数位占用1个字节
    numeric准确值(定点)小数数据类型,小数位完全精确numeric(M,D) unsigned zerofill
    # M最大65位,含小数30位
    # D最大30位
    每个小数位占用1个字节

    PS:decimal和numeric是一样的,只不过名字不一样,官方的说法:在MySQL中,NUMERIC实现为DECIMAL

    1.2 实践环境基本的说明

    ##### 数据库版本和默认的存储引擎
    mysql> select @@version,@@default_storage_engine;
    +------------+--------------------------+
    | @@version  | @@default_storage_engine |
    +------------+--------------------------+
    | 5.7.28-log | InnoDB                   |
    +------------+--------------------------+
    1 row in set (0.00 sec)
     
    
    ##### 事务的提交方式是自动的(主要是针对DML语句)
    mysql> select @@autocommit,@@global.autocommit;
    +--------------+---------------------+
    | @@autocommit | @@global.autocommit |
    +--------------+---------------------+
    |            1 |                   1 |
    +--------------+---------------------+
    1 row in set (0.00 sec)
    
    
    ##### 创建chenliang库,并进入到chenliang库下面
    mysql> create database if not exists chenliang character set utf8 collate utf8_general_ci;
    Query OK, 1 row affected (0.03 sec)
     
    mysql> use chenliang;
    Database changed
     
    mysql> select database();
    +------------+
    | database() |
    +------------+
    | chenliang  |
    +------------+
    1 row in set (0.01 sec)
    


    第2章 小数数据类型float

    2.1 float的总结性说明

    ##### 格式
    id        float(M,D)            unsigned                zerofill
    字段名     数据类型(要指定M和D)     无符号(只针对整数位)       无符号(只针对整数位,但整数位不会前导零填充显示)
    
    
    ##### float的M和D说明和示例
    M:表示"整数位""小数位"共多少位,M最大255位(包含小数位在内,小数30位);所以整数位最大长度是225;
    D:表示"小数位"最大多少位,最大30位;
    示例1:float(255,30)   # 整数位最大长度225位,小数位最大长度30位;
    示例2:float(50,20)    # 整数位最大长度30位,小数位最大长度20位;
    
    
    ##### float数据类型默认的小数位精确度(只能精确到第7位)
    字段定义:f float(255,30)   # 没有加unsigned和zerofill是因为它们都是针对整数位,而这里讨论的是小数位,跟他们没关系
    插入数据:insert into test12(f) values(1.555555555555555555555555555555);
    插入说明:往test12表中的f字段插入的数据是(整数位是1,小数位是30个5)
    显示结果:1.555555582046508800000000000000
    结果说明:可以看出小数位到第8位就不准确了(小数位只准确到了第7位)
    
    
    ##### 关于小数位的说明
    01:若插入数据的小数位长度没有达到指定的小数位长度,则会在小数后面用零填充显示(跟zerofill无关哈);
    02:若插入数据的小数位长度刚好达到指定的小数位长度,则不会用零填充,也不会四舍五入;
    03:若插入数据的小数位长度已经超过指定的小数位长度,则会进行四舍五入;
    
    
    ##### 生产环境下当字段指定的数据类型为 float(5,2) 的举例说明
    -- 加了unsigned属性
    	A:sql_mode开启了严格模式(sql_mode包含strict_trans_tables)
    	   插入1751.2    # 直接报错,因为开了严格模式,且指定的整数位最大长度是3
    	   插入-175.2    # 直接报错,因为开了严格模式,且加了unsigned属性(无符号,针对整数位),
    	   插入17.2      # 成功,整数位长度没超过指定长度3,显示的数据是17.20(小数位不够2位)
    	   插入17.245    # 成功,整数位长度没超过指定长度3,显示的是17.25(小数位超过长度,四舍五入)
    	
    	B:sql_mode未开启严格模式(sql_mode不包含strict_trans_tables)
    	   插入1751.2    # 成功且警告,虽然整数位超过了指定长度,但未开严格模式,到表中的数据是 999.99
    	   插入-175.2    # 成功且警告,虽然加了unsigned属性(针对整数位),但未开严格模式,到表中数据是 0.00
    	   插入17.2      # 成功,整数位长度没超过指定长度3,显示的数据是17.20(小数位不够2位)
    	   插入17.245    # 成功,整数位长度没超过指定长度3,显示的是17.25(小数位超过长度,四舍五入)
    
    
    -- 加了zerofill属性
    	A:sql_mode开启了严格模式(sql_mode包含strict_trans_tables)
    	   插入1751.2    # 直接报错,因为开了严格模式,且指定的整数位最大长度是3
    	   插入-175.2    # 直接报错,因为开了严格模式,且加了zerofill属性(无符号,针对整数位),
    	   插入17.2      # 成功,整数位长度没超过指定长度3,显示的数据是17.20(小数位不够2位)
    	   插入17.245    # 成功,整数位长度没超过指定长度3,显示的是17.25(小数位超过长度,四舍五入)
    	
    	B:sql_mode未开启严格模式(sql_mode不包含strict_trans_tables)
    	   插入1751.2    # 成功且警告,虽然整数位超过了指定长度,但未开严格模式,到表中的数据是 999.99
    	   插入-175.2    # 成功且警告,虽然加了unsigned属性(针对整数位),但未开严格模式,到表中数据是 00.00
    	   插入17.2      # 成功,整数位长度没超过指定长度3,显示的数据是17.20(小数位不够2位)
    	   插入17.245    # 成功,整数位长度没超过指定长度3,显示的是17.25(小数位超过长度,四舍五入)
    
    
    -- 没有加unsigned/zerofill属性
    	A:sql_mode开启了严格模式(sql_mode包含strict_trans_tables)
    	   插入1751.2    # 直接报错,因为开了严格模式,且指定的整数位最大长度是3;
    	   插入-175.2    # 成功,因为没加unsigned或zerofill属性,且整数位没超过长度;
    	   插入17.2      # 成功,整数位长度没超过指定长度3,显示的数据是17.20(小数位不够2位)
    	   插入17.245    # 成功,整数位长度没超过指定长度3,显示的是17.25(小数位超过长度,四舍五入)
    	
    	B:sql_mode未开启严格模式(sql_mode不包含strict_trans_tables)
    	   插入1751.2    # 成功且警告,虽然整数位超过了指定长度,但未开严格模式,到表中的数据是999.99
    	   插入-175.2    # 成功,因为没加unsigned或zerofill属性,且整数位没超过长度
    	   插入17.2      # 成功,整数位长度没超过指定长度3,显示的数据是17.20(小数位不够2位)
    	   插入17.245    # 成功,整数位长度没超过指定长度3,显示的是17.25(小数位超过长度,四舍五入)
    

    2.2 float数据类型小数位的默认精确度

    总结

    字段定义:f float(255,30)   # 没有加unsigned和zerofill是因为它们都是针对整数位,而这里讨论的是小数位,跟他们没关系
    插入数据:insert into test12(f) values(1.555555555555555555555555555555);
    插入说明:往test12表中的f字段插入的数据是(整数位是1,小数位是30个5)
    显示结果:1.555555582046508800000000000000
    结果说明:可以看出小数位到第8位就不准确了(小数位只准确到了第7位)
    

    实践

    #### 创建test22表
    create table if not exists test22(
    	f float(255,30)
    )engine=innodb character set utf8 collate utf8_general_ci;
    
        # f字段没有加unsigned和zerofill属性,因为我们讨论的是float的精确度
        # 整数位的最大长度是255,小数位的最大长度是30
    
    #### 查看tst22表的表结构
    mysql> desc test22;
    +-------+---------------+------+-----+---------+-------+
    | Field | Type          | Null | Key | Default | Extra |
    +-------+---------------+------+-----+---------+-------+
    | f     | float(255,30) | YES  |     | NULL    |       |
    +-------+---------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    
    #### 插入测试数据
    mysql> insert into test22(f) values(1.555555555555555555555555555555);
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from test22;
    +----------------------------------+
    | f                                |
    +----------------------------------+
    | 1.555555582046508800000000000000 |
    +----------------------------------+
    1 row in set (0.00 sec)
    

    2.3 测试unsigned属性

    注意:unsigned表示无符号,它只针对数值的整数位

    sql_mode开启了严格模式,即sql_mode参数中包含strict_trans_tables变量

    #### 设置当前会话模式下,sql_mode开启严格模式,DML语句自动提交
    set session autocommit=on;
    set session sql_mode="strict_trans_tables";
    
    
    #### 创建test23_1表,并查看表的表结构
    create table if not exists test23_1(
    	f float(5,2) unsigned
    )engine=innodb character set utf8 collate utf8_general_ci;
    
       # f字段整数位的最大长度是3,小数位的最大长度是2;
       # 加了unsigned属性,那么整数位只能是正整数;
       # 若插入数据的小数位长度没有达到指定的小数位长度,则会在小数后面用零填充显示;
       # 若插入数据的小数位长度刚好达到指定的小数位长度,则不会用零填充,也不会四舍五入;
       # 若插入数据的小数位长度已经超过指定的小数位长度,则会进行四舍五入;
       
    mysql> desc test23_1;
    +-------+---------------------+------+-----+---------+-------+
    | Field | Type                | Null | Key | Default | Extra |
    +-------+---------------------+------+-----+---------+-------+
    | f     | float(5,2) unsigned | YES  |     | NULL    |       |
    +-------+---------------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    
    #### 插入数据进行测试
    insert into test23_1(f) values(1751.2);
    		# 直接报错,因为插入数值的整数位超过了指定的长度3位,且开启了严格模式
    		# 数据不会到达表中
    
    insert into test23_1(f) values(-175.2);
    		# 直接报错,因为加了unsigned,整数位只能是正整数,且sql_mode开启了严格模式,
    		# 数据不会到达表中
    
    insert into test23_1(f) values(17.2);
            # 成功,插入到表中的数据是17.2,显示的时候是17.20,因为小数位长度不够2位,
            # 会在后面用零填充显示;
    
    insert into test23_1(f) values(17.245);
            # 成功,到表中的数据不是17.245,因为小数位超过指定的长度2了,会进行四舍五入
            # 最后到表中的数据是17.25,显示的时候也是17.25
    
    mysql> select * from test23_1;
    +--------+
    | f      |
    +--------+
    | 17.20  |
    | 17.25  |
    +--------+
    2 rows in set (0.00 sec)
    

    sql_mode未开启严格模式,即sql_mode参数中不包含strict_trans_tables变量

    #### 设置当前会话模式下,sql_mode未开启严格模式,DML语句自动提交
    set session autocommit=on;
    set session sql_mode="";
    
    
    #### 创建test23_2表,并查看表的表结构
    create table if not exists test23_2(
    	f float(5,2) unsigned
    )engine=innodb character set utf8 collate utf8_general_ci;
    
       # f字段整数位的最大长度是3,小数位的最大长度是2
       # 加了unsigned属性,那么整数位只能是正整数
       # 若插入数据的小数位长度没有达到指定的小数位长度,则会在小数后面用零填充显示
       # 若插入数据的小数位长度刚好达到指定的小数位长度,则不会用零填充,也不会四舍五入
       # 若插入数据的小数位长度已经超过指定的小数位长度,则会进行四舍五入;
       
    mysql> desc test23_2;
    +-------+---------------------+------+-----+---------+-------+
    | Field | Type                | Null | Key | Default | Extra |
    +-------+---------------------+------+-----+---------+-------+
    | f     | float(5,2) unsigned | YES  |     | NULL    |       |
    +-------+---------------------+------+-----+---------+-------+
    1 row in set (0.01 sec)
    
    
    #### 插入数据进行测试
    insert into test23_2(f) values(1751.2);
    		# 成功且有警告,按理说,整数位已经超过指定的长度3了,但sql_mode未开严格模式
    		# 数据会到达表中,到表中的数据是999.99
    
    insert into test23_2(f) values(-175.2);
    		# 成功且有警告,按理说,整数位应该是正整数,因为字段加了unsigned属性,但示开严格模
    		# 式,数据会到达表,到表中的数据是0.00
    
    insert into test23_2(f) values(17.2);
            # 成功,插入到表中的数据是175.2,显示的时候是175.20,因为小数位长度不够2位,
            # 会在后面用零填充显示;
    
    insert into test23_2(f) values(17.245);
            # 成功,到表中的数据不是17.245,因为小数位超过指定的长度2了,会进行四舍五入
            # 最后到表中的数据是17.25,显示的时候也是17.25
    
    mysql> select * from test23_2;
    +--------+
    | f      |
    +--------+
    | 999.99 |
    |   0.00 |
    | 17.20  |
    | 17.25  |
    +--------+
    4 rows in set (0.00 sec)
    

    2.4 测试zerofill属性

    注意:zerofill表示无符号,因为它包含unsigned属性,针对整数位,但不会进行前导0填充

    sql_mode开启了严格模式,即sql_mode参数中包含strict_trans_tables变量

    #### 设置当前会话模式下,sql_mode开启严格模式,DML语句自动提交
    set session autocommit=on;
    set session sql_mode="strict_trans_tables";
    
    
    #### 创建test24_1表,并查看表的表结构
    create table if not exists test24_1(
    	f float(5,2) zerofill
    )engine=innodb character set utf8 collate utf8_general_ci;
    
       # f字段整数位的最大长度是3,小数位的最大长度是2
       # 加了zerofill属性,那么整数位只能是正整数(且显示时会前导师零填充显示)
       # 若插入数据的小数位长度没有达到指定的小数位长度,则会在小数后面用零填充显示
       # 若插入数据的小数位长度刚好达到指定的小数位长度,则不会用零填充,也不会四舍五入
       # 若插入数据的小数位长度已经超过指定的小数位长度,则会进行四舍五入;
       
    mysql> desc test24_1;
    +-------+------------------------------+------+-----+---------+-------+
    | Field | Type                         | Null | Key | Default | Extra |
    +-------+------------------------------+------+-----+---------+-------+
    | f     | float(5,2) unsigned zerofill | YES  |     | NULL    |       |
    +-------+------------------------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    
    #### 插入数据进行测试
    insert into test24_1(f) values(1751.2);
    		# 直接报错,因为插入的数值的整数位超过了指定的长度3位,且sql_mode开启了严格模式,数据不会到达表中
    
    insert into test24_1(f) values(-175.2);
    		# 直接报错,因为加了zerofill,整数位只能是正整数,且sql_mode开启了严格模式,数据不会到达表中
    
    insert into test24_1(f) values(17.2);
    		# 成功,数据会到达表中,到表中的数据是17.2,最终显示的数据是17.20
    		# 整数位不够长度,不会前导0填充显示,即使加了zerofill属性
    		# 小数位不够长度,会后导0填充显示,这个和zerofill属性无关
    
    insert into test24_1(f) values(17.245);
    		# 成功,到表中的数据是17.25,显示的时候是17.25
    		# 整数位不够长度,不会前导0填充显示,即使加了zerofill属性
    		# 小数位超过长度,会四舍五入
    
    mysql> select * from test24_1;
    +-------+
    | f     |
    +-------+
    | 17.20 |
    | 17.25 |
    +-------+
    2 rows in set (0.00 sec)
    

    sql_mode未开启严格模式,即sql_mode参数中不包含strict_trans_tables变量

    #### 设置当前会话模式下,sql_mode未开启严格模式,DML语句自动提交
    set session autocommit=on;
    set session sql_mode="";
    
    
    #### 创建test24_2表,并查看表的表结构
    create table if not exists test24_2(
    	f float(5,2) zerofill
    )engine=innodb character set utf8 collate utf8_general_ci;
    
       # f字段整数位的最大长度是3,小数位的最大长度是2
       # 加了zerofill属性,那么整数位只能是正整数(且显示时会前导师零填充显示)
       # 若插入数据的小数位长度没有达到指定的小数位长度,则会在小数后面用零填充显示
       # 若插入数据的小数位长度刚好达到指定的小数位长度,则不会用零填充,也不会四舍五入
       # 若插入数据的小数位长度已经超过指定的小数位长度,则会进行四舍五入;
       
    mysql> desc test24_2;
    +-------+------------------------------+------+-----+---------+-------+
    | Field | Type                         | Null | Key | Default | Extra |
    +-------+------------------------------+------+-----+---------+-------+
    | f     | float(5,2) unsigned zerofill | YES  |     | NULL    |       |
    +-------+-------------------------------------------------------------+
    
    #### 插入数据进行测试
    insert into test24_2(f) values(1751.2);
    		# 成功且有警告,虽然整数位超过了指定长度3,但sql_mode未开严格模式
    		# 所以到表中的数据是999.99
    
    insert into test24_2(f) values(-175.2);
    		# 成都且有警告,虽然整数位不能是负整数,但sql_mode未开严格模式
    		# 所以到表中的数据是00.00
    
    insert into test24_2(f) values(17.2);
    		# 成功,数据会到达表中,到表中的数据是17.2,最终显示的数据是17.20
    		# 整数位不够长度,不会前导0填充显示,即使加了zerofill属性
    		# 小数位不够长度,会后导0填充显示,这个和zerofill属性无关
    
    insert into test24_2(f) values(17.245);
    		# 成功,到表中的数据是17.25,显示的时候是17.25
    		# 整数位不够长度,不会前导0填充显示,即使加了zerofill属性;
    		# 小数位超过长度,会四舍五入;
    
    mysql> select * from test24_2;
    +--------+
    | f      |
    +--------+
    | 999.99 |
    |  00.00 |
    |  17.20 |
    |  17.25 |
    +--------+
    4 rows in set (0.00 sec)
    

    2.5 测试不加unsigned/zerofill属性

    注意:不加unsigned和zerofill属性,这样数值的整数位就可以是正整数或者负整数了

    sql_mode开启了严格模式,即sql_mode参数中包含strict_trans_tables变量

    #### 设置当前会话模式下,sql_mode开启严格模式,DML语句自动提交
    set session autocommit=on;
    set session sql_mode="strict_trans_tables";
    
    
    #### 创建test25_1表,并查看其表结构
    create table if not exists test25_1(
      f float(5,2)
    )engine=innodb character set utf8 collate utf8_general_ci;
    
       # f字段整数位的最大长度是3,小数位的最大长度是2;
       # 没有加unsigned/zerofill属性,那么整数位可以是正整数和负整数
       # 若插入数据的小数位长度没有达到指定的小数位长度,则会在小数后面用零填充显示;
       # 若插入数据的小数位长度刚好达到指定的小数位长度,则不会用零填充,也不会四舍五入;
       # 若插入数据的小数位长度已经超过指定的小数位长度,则会进行四舍五入;
    
    mysql> desc test25_1;
    +-------+------------+------+-----+---------+-------+
    | Field | Type       | Null | Key | Default | Extra |
    +-------+------------+------+-----+---------+-------+
    | f     | float(5,2) | YES  |     | NULL    |       |
    +-------+------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    
    #### 插入测试数据进行测试
    insert into test25_1(f) values(1751.2);
    		# 直接报错,因为插入数值的整数位超过了指定的长度3位,且开启了严格模式
    		# 数据不会到达表中
    
    insert into test25_1(f) values(-175.2);
    		# 成功,因为没加unsigned/zerofill,整数位可以是负正整数,数据会到达表中
    
    insert into test25_1(f) values(17.2);
            # 成功,插入到表中的数据是17.2,显示的时候是17.20,因为小数位长度不够2位,
            # 会在后面用零填充显示;
    
    insert into test25_1(f) values(17.245);
            # 成功,到表中的数据不是17.245,因为小数位超过指定的长度2了,会进行四舍五入
            # 最后到表中的数据是17.25,显示的时候也是17.25
    
    mysql> select * from test25_1;
    +---------+
    | f       |
    +---------+
    | -175.20 |
    |   17.20 |
    |   17.25 |
    +---------+
    3 rows in set (0.00 sec)
    

    sql_mode未开启严格模式,即sql_mode参数中不包含strict_trans_tables变量

    #### 设置当前会话模式下,sql_mode未开启严格模式,DML语句自动提交
    set session autocommit=on;
    set session sql_mode="";
    
    
    #### 创建test26_2表,并查看其表结构
    create table if not exists test25_2(
      f float(5,2)
    )engine=innodb character set utf8 collate utf8_general_ci;
    
       # f字段整数位的最大长度是3,小数位的最大长度是2;
       # 没有加unsigned/zerofill属性,那么整数位可以是正整数和负整数
       # 若插入数据的小数位长度没有达到指定的小数位长度,则会在小数后面用零填充显示;
       # 若插入数据的小数位长度刚好达到指定的小数位长度,则不会用零填充,也不会四舍五入;
       # 若插入数据的小数位长度已经超过指定的小数位长度,则会进行四舍五入;
    
    mysql> desc test25_2;
    +-------+------------+------+-----+---------+-------+
    | Field | Type       | Null | Key | Default | Extra |
    +-------+------------+------+-----+---------+-------+
    | f     | float(5,2) | YES  |     | NULL    |       |
    +-------+------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    
    #### 插入测试数据进行测试
    insert into test25_2(f) values(1751.2);
    		# 成功且警告,整数位超过长度3,但未开启严格模式;数据到表中是999.99
    
    insert into test25_2(f) values(-175.2);
    		# 成功,因为没加unsigned/zerofill,整数位可以是负正整数,数据会到达表中;
    
    insert into test25_2(f) values(17.2);
            # 成功,插入到表中的数据是17.2,显示的时候是17.20,因为小数位长度不够2位,
            # 会在后面用零填充显示;
    
    insert into test25_2(f) values(17.245);
            # 成功,到表中的数据不是17.245,因为小数位超过指定的长度2了,会进行四舍五入
            # 最后到表中的数据是17.25,显示的时候也是17.25
    
    mysql> select * from test25_2;
    +---------+
    | f       |
    +---------+
    |  999.99 |
    | -175.20 |
    |   17.20 |
    |   17.25 |
    +---------+
    4 rows in set (0.00 sec)
    


    第3章 小数数据类型double

    3.1 double的总结性说明

    ## 格式
    id      double(M,D)         unsigned            zerofill
    字段名    数据类型(要指定M和D)    无符号(只针对整数位)    无符号(只针对整数位,但整数位不会前导零填充显示)
    
    
    ## double的M和D说明和示例
    M:表示"整数位""小数位"共多少位,M最大255位(包含小数位在内,小数30位);所以整数位最大长度是225;
    D:表示"小数位"最大多少位,最大30位;
    示例1:double(255,30)   # 整数位最大长度225位,小数位最大长度30位;
    示例2:double(50,20)    # 整数位最大长度30位,小数位最大长度20位;
    
    
    ## 关于小数位的说明
    01:若插入数据的小数位长度没有达到指定的小数位长度,则会在小数后面用零填充显示(跟zerofill无关哈);
    02:若插入数据的小数位长度刚好达到指定的小数位长度,则不会用零填充,也不会四舍五入;
    03:若插入数据的小数位长度已经超过指定的小数位长度,则会进行四舍五入;
    
    
    ## 关于double数据类型小数位的精确度说明
    字段定义:d double(255,30)  # 整数位最大长度225位,小数位最大长度30位
    定义说明:没加unsigned和zerofill是因它们都是针对整数位,而这里讨论的是小数位,跟他们没关系 
    插入数据:insert into test12(d) values(1.555555555555555555555555555555);
    插入说明:往test12表中的d字段插入的数据是(整数位是1,小数位是30个5)
    显示结果:1.555555555555555600000000000000
    结果说明:可以看出小数位到第16位就不准确了(小数位只准确到了第16位)
    
    
    ## 生产环境下当字段指定的数据类型为 double(5,2) 的举例说明
    -- 加了unsigned属性
    	A:sql_mode开启了严格模式(sql_mode包含strict_trans_tables)
    	   插入1751.2    # 直接报错,因为开了严格模式,且指定的整数位最大长度是3
    	   插入-175.2    # 直接报错,因为开了严格模式,且加了unsigned属性(无符号,针对整数位),
    	   插入17.2      # 成功,整数位长度没超过指定长度3,显示的数据是17.20(小数位不够2位)
    	   插入17.245    # 成功,整数位长度没超过指定长度3,显示的是17.25(小数位超过长度,四舍五入)
    	
    	B:sql_mode未开启严格模式(sql_mode不包含strict_trans_tables)
    	  插入1751.2     # 成功且警告,虽然整数位超过了指定长度,但未开严格模式,到表中的数据是999.99
    	   插入-175.2    # 成功且警告,虽然加了unsigned属性(针对整数位),但未开严格模式,到表中数据是0.00
    	   插入17.2      # 成功,整数位长度没超过指定长度3,显示的数据是17.20(小数位不够2位)
    	   插入17.245    # 成功,整数位长度没超过指定长度3,显示的是17.25(小数位超过长度,四舍五入)
    
    -- 加了zerofill属性
    	A:sql_mode开启了严格模式(sql_mode包含strict_trans_tables)
    	   插入1751.2    # 直接报错,因为开了严格模式,且指定的整数位最大长度是3
    	   插入-175.2    # 直接报错,因为开了严格模式,且加了zerofill属性(无符号,针对整数位),
    	   插入17.2      # 成功,整数位长度没超过指定长度3,显示的数据是17.20(小数位不够2位)
    	   插入17.245    # 成功,整数位长度没超过指定长度3,显示的是17.25(小数位超过长度,四舍五入)
    	
    	B:sql_mode未开启严格模式(sql_mode不包含strict_trans_tables)
    	   插入1751.2    # 成功且警告,虽然整数位超过了指定长度,但未开严格模式,到表中的数据是999.99
    	   插入-175.2    # 成功且警告,虽然加了unsigned属性(针对整数位),但未开严格模式,到表中数据是00.00
    	   插入17.2      # 成功,整数位长度没超过指定长度3,显示的数据是17.20(小数位不够2位)
    	   插入17.245    # 成功,整数位长度没超过指定长度3,显示的是17.25(小数位超过长度,四舍五入)
    
    -- 没加unsigned/zerofill属性
    	A:sql_mode开启了严格模式(sql_mode包含strict_trans_tables)
    	   插入1751.2    # 直接报错,因为开了严格模式,且指定的整数位最大长度是3
    	   插入-175.2    # 成功,因为没加unsigned或zerofill属性,且整数位没超过长度
    	   插入17.2      # 成功,整数位长度没超过指定长度3,显示的数据是17.20(小数位不够2位)
    	   插入17.245    # 成功,整数位长度没超过指定长度3,显示的是17.25(小数位超过长度,四舍五入)
    	
    	B:sql_mode未开启严格模式(sql_mode不包含strict_trans_tables)
    	   插入1751.2    # 成功且警告,虽然整数位超过了指定长度,但未开严格模式,到表中的数据是999.99
    	   插入-175.2    # 成功,因为没加unsigned或zerofill属性,且整数位没超过长度
    	   插入17.2      # 成功,整数位长度没超过指定长度3,显示的数据是17.20(小数位不够2位)
    	   插入17.245    # 成功,整数位长度没超过指定长度3,显示的是17.25(小数位超过长度,四舍五入)
    

    3.2 double数据类型小数位的默认精确度

    总结

    字段定义:d double(255,30)  
    插入数据:insert into test13(f) values(1.555555555555555555555555555555);
    结果显示:1.555555555555555600000000000000
    结果总结:可以看出小数位的第16位就不准确了,只准确到了第15位小数位;
    

    实践

    #### 创建test32表
    create table if not exists test32(
    	d double(255,30)
    )engine=innodb character set utf8 collate utf8_general_ci;
    
    	# f字段没有加unsigned和zerofill属性,因为我们讨论的是float的精确度
    	# 整数位的最大长度是255,小数位的最大长度是30
    
    
    #### 查看test32表的表结构
    mysql> desc test32;
    +-------+---------------+------+-----+---------+-------+
    | Field | Type          | Null | Key | Default | Extra |
    +-------+---------------+------+-----+---------+-------+
    | d     | double(255,30)| YES  |     | NULL    |       |
    +-------+---------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    
    #### 插入测试数据
    mysql> insert into test32(d) values(1.555555555555555555555555555555);
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from test32;
    +----------------------------------+
    | d                                |
    +----------------------------------+
    | 1.555555555555555600000000000000 |
    +----------------------------------+
    1 row in set (0.00 sec)
    

    3.3 测试unsigned属性

    注意:unsigned表示无符号,它只针对数值的整数位

    sql_mode开启了严格模式,即sql_mode参数中包含strict_trans_tables变量

    #### 设置当前会话模式下,sql_mode开启严格模式,DML语句自动提交
    set session autocommit=on;
    set session sql_mode="strict_trans_tables";
    
    
    #### 创建test33_1表,并查看表的表结构
    create table if not exists test33_1(
    	d double(5,2) unsigned
    )engine=innodb character set utf8 collate utf8_general_ci;
    
       # f字段整数位的最大长度是3,小数位的最大长度是2;
       # 加了unsigned属性,那么整数位只能是正整数;
       # 若插入数据的小数位长度没有达到指定的小数位长度,则会在小数后面用零填充显示;
       # 若插入数据的小数位长度刚好达到指定的小数位长度,则不会用零填充,也不会四舍五入;
       # 若插入数据的小数位长度已经超过指定的小数位长度,则会进行四舍五入;
       
    mysql> desc test33_1;
    +-------+---------------------+------+-----+---------+-------+
    | Field | Type                | Null | Key | Default | Extra |
    +-------+---------------------+------+-----+---------+-------+
    | d     | double(5,2) unsigned| YES  |     | NULL    |       |
    +-------+---------------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    
    #### 插入数据进行测试
    insert into test33_1(d) values(1751.2);
    		# 直接报错,因为插入数值的整数位超过了指定的长度3位,且开启了严格模式
    		# 数据不会到达表中
    
    insert into test33_1(d) values(-175.2);
    		# 直接报错,因为加了unsigned,整数位只能是正整数,且sql_mode开启了严格模式,
    		# 数据不会到达表中
    
    insert into test33_1(d) values(17.2);
            # 成功,插入到表中的数据是17.2,显示的时候是17.20,因为小数位长度不够2位,
            # 会在后面用零填充显示;
    
    insert into test33_1(d) values(17.245);
            # 成功,到表中的数据不是17.245,因为小数位超过指定的长度2了,会进行四舍五入
            # 最后到表中的数据是17.25,显示的时候也是17.25
    
    mysql> select * from test33_1;
    +--------+
    | d      |
    +--------+
    | 17.20  |
    | 17.25  |
    +--------+
    2 rows in set (0.00 sec)
    

    sql_mode未开启严格模式,即sql_mode参数中不包含strict_trans_tables变量

    #### 设置当前会话模式下,sql_mode未开启严格模式,DML语句自动提交
    set session autocommit=on;
    set session sql_mode="";
    
    
    #### 创建test33_2表,并查看表的表结构
    create table if not exists test33_2(
    	d double(5,2) unsigned
    )engine=innodb character set utf8 collate utf8_general_ci;
    
       # f字段整数位的最大长度是3,小数位的最大长度是2
       # 加了unsigned属性,那么整数位只能是正整数
       # 若插入数据的小数位长度没有达到指定的小数位长度,则会在小数后面用零填充显示
       # 若插入数据的小数位长度刚好达到指定的小数位长度,则不会用零填充,也不会四舍五入
       # 若插入数据的小数位长度已经超过指定的小数位长度,则会进行四舍五入;
       
    mysql> desc test33_2;
    +-------+----------------------+------+-----+---------+-------+
    | Field | Type                 | Null | Key | Default | Extra |
    +-------+----------------------+------+-----+---------+-------+
    | d     | double(5,2) unsigned | YES  |     | NULL    |       |
    +-------+----------------------+------+-----+---------+-------+
    1 row in set (0.01 sec)
    
    
    #### 插入数据进行测试
    insert into test33_2(d) values(1751.2);
    		# 成功且有警告,按理说,整数位已经超过指定的长度3了,但sql_mode未开严格模式
    		# 数据会到达表中,到表中的数据是999.99
    
    insert into test33_2(d) values(-175.2);
    		# 成功且有警告,按理说,整数位应该是正整数,因为字段加了unsigned属性,但示开严格模
    		# 式,数据会到达表,到表中的数据是0.00
    
    insert into test33_2(d) values(17.2);
            # 成功,插入到表中的数据是175.2,显示的时候是175.20,因为小数位长度不够2位,
            # 会在后面用零填充显示;
    
    insert into test33_2(d) values(17.245);
            # 成功,到表中的数据不是17.245,因为小数位超过指定的长度2了,会进行四舍五入
            # 最后到表中的数据是17.25,显示的时候也是17.25
    
    mysql> select * from test33_2;
    +--------+
    | d      |
    +--------+
    | 999.99 |
    |   0.00 |
    | 17.20  |
    | 17.25  |
    +--------+
    4 rows in set (0.00 sec)
    

    3.4 测试zerofill属性

    注意:zerofill表示无符号,因为它包含unsigned属性,针对整数位,但不会进行前导0填充

    sql_mode开启了严格模式,即sql_mode参数中包含strict_trans_tables变量

    #### 设置当前会话模式下,sql_mode开启严格模式,DML语句自动提交
    set session autocommit=on;
    set session sql_mode="strict_trans_tables";
    
    
    #### 创建test34_1表,并查看表的表结构
    create table if not exists test34_1(
    	d double(5,2) zerofill
    )engine=innodb character set utf8 collate utf8_general_ci;
    
       # f字段整数位的最大长度是3,小数位的最大长度是2
       # 加了zerofill属性,那么整数位只能是正整数(且显示时会前导师零填充显示)
       # 若插入数据的小数位长度没有达到指定的小数位长度,则会在小数后面用零填充显示
       # 若插入数据的小数位长度刚好达到指定的小数位长度,则不会用零填充,也不会四舍五入
       # 若插入数据的小数位长度已经超过指定的小数位长度,则会进行四舍五入;
    
    mysql> desc test34_1;
    +-------+-------------------------------+------+-----+---------+-------+
    | Field | Type                          | Null | Key | Default | Extra |
    +-------+-------------------------------+------+-----+---------+-------+
    | d     | double(5,2) unsigned zerofill | YES  |     | NULL    |       |
    +-------+-------------------------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    
    #### 插入数据进行测试
    insert into test34_1(d) values(1751.2);
    		# 直接报错,因为插入的数值的整数位超过了指定的长度3位,数据不会到达表中
    
    insert into test34_1(d) values(-175.2);
    		# 直接报错,因为加了zerofill,整数位只能是正整数,且sql_mode开启了严格模式,
    		# 数据不会到达表中
    
    insert into test34_1(d) values(17.2);
    		# 成功,数据会到达表中,到表中的数据是17.2,最终显示的数据是17.20
    		# 整数位不够长度,不会前导0填充显示,即使加了zerofill属性
    		# 小数位不够长度,会后导0填充显示,这个和zerofill属性无关
    
    insert into test34_1(d) values(17.245);
    		# 成功,到表中的数据是17.25,显示的时候是17.25
    		# 整数位不够长度,不会前导0填充显示,即使加了zerofill属性
    		# 小数位超过长度,会四舍五入
    
    mysql> select * from test34_1;
    +-------+
    | d     |
    +-------+
    | 17.20 |
    | 17.25 |
    +-------+
    2 rows in set (0.00 sec)
    

    sql_mode未开启严格模式,即sql_mode参数中不包含strict_trans_tables变量

    #### 设置当前会话模式下,sql_mode未开启严格模式,DML语句自动提交
    set session autocommit=on;
    set session sql_mode="";
    
    
    #### 创建test34_2表,并查看表的表结构
    create table if not exists test34_2(
    	d double(5,2) zerofill
    )engine=innodb character set utf8 collate utf8_general_ci;
      
       # f字段整数位的最大长度是3,小数位的最大长度是2
       # 加了zerofill属性,那么整数位只能是正整数(且显示时会前导师零填充显示)
       # 若插入数据的小数位长度没有达到指定的小数位长度,则会在小数后面用零填充显示
       # 若插入数据的小数位长度刚好达到指定的小数位长度,则不会用零填充,也不会四舍五入
       # 若插入数据的小数位长度已经超过指定的小数位长度,则会进行四舍五入;
       
    mysql> desc test34_2;
    +-------+------------------------------ +------+-----+---------+-------+
    | Field | Type                          | Null | Key | Default | Extra |
    +-------+-------------------------------+------+-----+---------+-------+
    | d     | double(5,2) unsigned zerofill | YES  |     | NULL    |       |
    +-------+-------------------------------+------+-----+---------+-------+
    
    #### 插入数据进行测试
    insert into test34_2(d) values(1751.2);
    		# 成功且有警告,虽然整数位超过了指定长度3,但sql_mode未开严格模式
    		# 所以到表中的数据是999.99
    
    insert into test34_2(d) values(-175.2);
    		# 成都且有警告,虽然整数位不能是负整数,但sql_mode未开严格模式
    		# 所以到表中的数据是00.00
    
    insert into test34_2(d) values(17.2);
    		# 成功,数据会到达表中,到表中的数据是17.2,最终显示的数据是17.20
    		# 整数位不够长度,不会前导0填充显示,即使加了zerofill属性
    		# 小数位不够长度,会后导0填充显示,这个和zerofill属性无关
    
    insert into test34_2(d) values(17.245);
    		# 成功,到表中的数据是17.25,显示的时候是17.25
    		# 整数位不够长度,不会前导0填充显示,即使加了zerofill属性;
    		# 小数位超过长度,会四舍五入;
    
    mysql> select * from test34_2;
    +--------+
    | d      |
    +--------+
    | 999.99 |
    |  00.00 |
    |  17.20 |
    |  17.25 |
    +--------+
    4 rows in set (0.00 sec)
    

    3.5 测试不加unsigned/zerofill属性

    注意:不加unsigned和zerofill属性,这样数值的整数位就可以是正整数或者负整数了

    sql_mode开启了严格模式,即sql_mode参数中包含strict_trans_tables变量

    #### 设置当前会话模式下,sql_mode开启严格模式,DML语句自动提交
    set session autocommit=on;
    set session sql_mode="strict_trans_tables";
    
    
    #### 创建test35_1表,并查看其表结构
    create table if not exists test35_1(
      d double(5,2)
    )engine=innodb character set utf8 collate utf8_general_ci;
    
       # f字段整数位的最大长度是3,小数位的最大长度是2;
       # 没有加unsigned/zerofill属性,那么整数位可以是正整数和负整数
       # 若插入数据的小数位长度没有达到指定的小数位长度,则会在小数后面用零填充显示;
       # 若插入数据的小数位长度刚好达到指定的小数位长度,则不会用零填充,也不会四舍五入;
       # 若插入数据的小数位长度已经超过指定的小数位长度,则会进行四舍五入;
    
    mysql> desc test35_1;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | d     | double(5,2) | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    
    #### 插入测试数据进行测试
    insert into test35_1(d) values(1751.2);
    		# 直接报错,因为插入数值的整数位超过了指定的长度3位,且开启了严格模式
    		# 数据不会到达表中
    
    insert into test35_1(d) values(-175.2);
    		# 成功,因为没加unsigned/zerofill,整数位可以是负正整数,数据会到达表中是-175.20
    
    insert into test35_1(d) values(17.2);
            # 成功,插入到表中的数据是17.2,显示的时候是17.20,因为小数位长度不够2位,
            # 会在后面用零填充显示;
    
    insert into test35_1(d) values(17.245);
            # 成功,到表中的数据不是17.245,因为小数位超过指定的长度2了,会进行四舍五入
            # 最后到表中的数据是17.25,显示的时候也是17.25
    
    mysql> select * from test35_1;
    +---------+
    | d       |
    +---------+
    | -175.20 |
    |   17.20 |
    |   17.25 |
    +---------+
    3 rows in set (0.00 sec)
    

    sql_mode未开启严格模式,即sql_mode参数中不包含strict_trans_tables变量

    #### 设置当前会话模式下,sql_mode未开启严格模式,DML语句自动提交
    set session autocommit=on;
    set session sql_mode="";
    
    
    #### 创建test35_2表,并查看其表结构
    create table if not exists test35_2(
      d double(5,2)
    )engine=innodb character set utf8 collate utf8_general_ci;
    
       # f字段整数位的最大长度是3,小数位的最大长度是2;
       # 没有加unsigned/zerofill属性,那么整数位可以是正整数和负整数
       # 若插入数据的小数位长度没有达到指定的小数位长度,则会在小数后面用零填充显示;
       # 若插入数据的小数位长度刚好达到指定的小数位长度,则不会用零填充,也不会四舍五入;
       # 若插入数据的小数位长度已经超过指定的小数位长度,则会进行四舍五入;
    
    mysql> desc test35_2;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | d     | double(5,2) | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    
    #### 插入测试数据进行测试
    insert into test35_2(d) values(1751.2);
            # 成功且警告,整数位超过长度3,但未开启严格模式;数据到表中是999.99
    
    insert into test35_2(d) values(-175.2);
    		# 成功,因为没加unsigned/zerofill,整数位可以是负正整数,数据会到达表中,-175.20
    
    
    insert into test35_2(d) values(17.2);
            # 成功,插入到表中的数据是17.2,显示的时候是17.20,因为小数位长度不够2位,
            # 会在后面用零填充显示;
    
    insert into test35_2(d) values(17.245);
            # 成功,到表中的数据不是17.245,因为小数位超过指定的长度2了,会进行四舍五入
            # 最后到表中的数据是17.25,显示的时候也是17.25
    
    mysql> select * from test35_2;
    +---------+
    | d       |
    +---------+
    |  999.99 |
    | -175.20 |
    |   17.20 |
    |   17.25 |
    +---------+
    4 rows in set (0.00 sec)
    


    第4章 小数数据类型decimal

    4.1 decimal的总结性说明

    注意:numeric只是decimal的一个同意词

    #### 格式
    id    decimal(M,D)      unsigned            zerofill
    字段名  数据类型(要指定的哈)   无符号(只针对整数位)   无符号(包含unsigned,只针对整数位,会前导0填充)
    
    
    #### decimal的M和D的最大值说明和示例
    M:"整数位""小数位"共多少位,最大65位(含小数在内,小数30位);所以整数位最大长度是35;
    D:表示"小数位"最大多少位,最大30位;
    示例1:decimal(65,30)    # 整数位最大长度35位,小数位最大长度30位;
    示例2:decimal(50,20)    # 整数位最大长度30位,小数位最大长度20位;
    
    
    #### 关于小数位的说明
    01:若插入数据的小数位长度没有达到指定的小数位长度,则会在小数后面用零填充显示(跟zerofill无关哈);
    02:若插入数据的小数位长度刚好达到指定的小数位长度,则不会用零填充,也不会四舍五入;
    03:若插入数据的小数位长度已经超过指定的小数位长度,则会进行四舍五入;
    
    
    #### 关于decimal数据类型小数位的精确度说明
    字段定义:decimal(65,30)  # 整数位最大长度35位,小数位最大长度30位
    定义说明:没加unsigned和zerofill是因它们都是针对整数位,而这里讨论的是小数位,跟他们没关系
    插入数据:insert into test12(d) values(1.555555555555555555555555555555);
    插入说明:往test12表中的d字段插入的数据是(整数位是1,小数位是30个5)
    显示结果:1.555555555555555555555555555555  <== 小数位精确度到了30位
    
    
    #### 生产环境下当字段指定的数据类型为 decimal(5,2) 的举例说明
    -- 加了unsigned属性
    	A:sql_mode开启了严格模式(sql_mode包含strict_trans_tables)
    	   插入1751.2   # 直接报错,因开了严格模式,且整数位超过指定的最大长度3
    	   插入-175.2   # 直接报错,因开了严格模式,且加了unsigned属性
    	   插入17.2     # 成功,整数位长度没超过指定长度3,显示的数据是17.20(小数位不够2位)
    	   插入17.245   # 成功,整数位长度没超过指定长度3,小数位超过长度会四舍五入,结果:17.25
    	
    	B:sql_mode未开启严格模式(sql_mode不包含strict_trans_tables)
    	   插入1751.2   # 成功且警告,虽然整数位超过了指定长度,但未开严格模式,到表中的数据是999.99
    	   插入-175.2   # 成功且警告,虽然加了unsigned属性(针对整数位),但未开严格模式,到表中数据是0.00
    	   插入17.2     # 成功,整数位长度没超过指定长度3,小数位不够长度,用0填充,最终结果:17.20
    	   插入17.245   # 成功,整数位长度没超过指定长度3,小数位超过长度,四舍五入,最终结果:17.25
    
    
    -- 加了zerofill属性
    	A:sql_mode开启了严格模式(sql_mode包含strict_trans_tables)
    	   插入1751.2    # 直接报错,因开了严格模式,且整数位超过指定的最大长度是3
    	   插入-175.2    # 直接报错,因为开了严格模式,且加了zerofill属性,整数位只能插入正整数;
    	   插入17.2      # 成功,整数位长度没超过指定长度3,小数位长度不够,用0填充,结果:017.20
    	   插入17.245    # 成功,整数位长度没超过指定长度3,小数位长度超过,四舍五入,结果:017.25
    	
    	B:sql_mode未开启严格模式(sql_mode不包含strict_trans_tables)
    	   插入1751.2    # 成功且警告,虽然整数位超过了指定长度,但未开严格模式,到表中的数据是999.99
    	   插入-175.2    # 成功且警告,虽然加了zerofill属性(针对整数位),但未开严格模式,到表中数据是000.00
    	   插入17.2      # 成功,整数位长度没超过指定长度3,小数位长度不够,用0填充,结果:017.20
    	   插入17.245    # 成功,整数位长度没超过指定长度3,小数位长度超过,四舍五入,结果:017.25
    
    
    -- 没加unsigned/zerofill属性
    	A:sql_mode开启了严格模式(sql_mode包含strict_trans_tables)
    	   插入1751.2    # 直接报错,因为开了严格模式,且指定的整数位最大长度是3
    	   插入-175.2    # 成功,因为没加unsigned或zerofill属性,且整数位没超过长度
    	   插入17.2      # 成功,整数位长度没超过指定长度3,小数位长度不够,用0填充,结果:17.20
    	   插入17.245    # 成功,整数位长度没超过指定长度3,小数位长度超过,四舍五入,结果:17.25
    	
    	B:sql_mode未开启严格模式(sql_mode不包含strict_trans_tables)
    	   插入1751.2    # 成功且警告,虽然整数位超过了指定长度,但未开严格模式,到表中的数据是999.99
    	   插入-175.2    # 成功,因为没加unsigned或zerofill属性,且整数位没超过长度
    	   插入17.2      # 成功,整数位长度没超过指定长度3,小数位长度不够,用0填充,结果:17.20
    	   插入17.245    # 成功,整数位长度没超过指定长度3,小数位长度超过,四舍五入,结果:17.25
    

    4.2 decimal数据类型的默认小数位精确度

    总结

    字段定义:decimal(65,30)  # 整数位最大长度35位,小数位最大长度30位
    定义说明:没加unsigned和zerofill是因它们都是针对整数位,而这里讨论的是小数位,跟他们没关系
    插入数据:insert into test12(d) values(1.555555555555555555555555555555);
    插入说明:往test12表中的d字段插入的数据是(整数位是1,小数位是30个5)
    显示结果:1.555555555555555555555555555555    <== 小数位精确度到了30位
    

    实践

    #### 创建test42表,并查看其表结构
    create table if not exists test42(
      d decimal(65,30)
    )engine=innodb character set utf8 collate utf8_general_ci;
    
    mysql> desc test42;
    +-------+----------------+------+-----+---------+-------+
    | Field | Type           | Null | Key | Default | Extra |
    +-------+----------------+------+-----+---------+-------+
    | d     | decimal(65,30) | YES  |     | NULL    |       |
    +-------+----------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    
    #### 插入测试数据
    mysql> insert into test42(d) values(1.555555555555555555555555555555);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from test42;
    +----------------------------------+
    | d                                |
    +----------------------------------+
    | 1.555555555555555555555555555555 |
    +----------------------------------+
    1 row in set (0.00 sec)
    

    4.3 测试unsigned属性

    注意:加了unsigned属性,那么整数位就只能是正整数

    sql_mode开启了严格模式,即sql_mode参数中包含strict_trans_tables

    #### 当前会话模式下,sql_mode开启严格模式,DML语句自动提交
    set session autocommit=on;
    set session sql_mode="strict_trans_tables";
    
    
    #### 创建test43_1表,并查看其表结构
    create table if not exists test43_1(
      d decimal(5,2) unsigned
    )engine=innodb character set utf8 collate utf8_general_ci;
       # f字段整数位的最大长度是3,小数位的最大长度是2;
       # 加了unsigned属性,那么整数位只能是正整数;
       # 若插入数据的小数位长度没有达到指定的小数位长度,则会在小数后面用零填充显示;
       # 若插入数据的小数位长度刚好达到指定的小数位长度,则不会用零填充,也不会四舍五入;
       # 若插入数据的小数位长度已经超过指定的小数位长度,则会进行四舍五入;
       
    mysql> desc test43_1;
    +-------+-----------------------+------+-----+---------+-------+
    | Field | Type                  | Null | Key | Default | Extra |
    +-------+-----------------------+------+-----+---------+-------+
    | d     | decimal(5,2) unsigned | YES  |     | NULL    |       |
    +-------+-----------------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    
    #### 插入测试数据
    insert into test43_1(d) values(1751.2);
    		# 直接报错,因为插入数值的整数位超过了指定的长度3位,且开启了严格模式
    		# 数据不会到达表中
    
    insert into test43_1(d) values(-175.2);
    		# 直接报错,因为加了unsigned,整数位只能是正整数,且sql_mode开启了严格模式,
    		# 数据不会到达表中
    
    insert into test43_1(d) values(17.2);
            # 成功,插入到表中的数据是17.2,显示的时候是17.20,因为小数位长度不够2位,
            # 会在后面用零填充显示; 最终的结果是:17.20
    
    insert into test43_1(d) values(17.245);
            # 成功,到表中的数据不是17.245,因为小数位超过指定的长度2了,会进行四舍五入
            # 最后到表中的数据是17.25,显示的时候也是17.25
    
    mysql> select * from test43_1;
    +---------+
    | d       |
    +---------+
    |   17.20 |
    |   17.25 |
    +---------+
    3 rows in set (0.00 sec)
    

    sql_mode未开启严格模式,即sql_mode参数中不包含strict_trans_tables

    #### 当前会话模式下,sql_mode不开启严格模式,DML语句自动提交
    set session autocommit=on;
    set session sql_mode="";
    
    
    #### 创建test43_2表,并查看其表结构
    create table if not exists test43_2(
      d decimal(5,2) unsigned
    )engine=innodb character set utf8 collate utf8_general_ci;
    
       # f字段整数位的最大长度是3,小数位的最大长度是2;
       # 加了unsigned属性,那么整数位只能是正整数;
       # 若插入数据的小数位长度没有达到指定的小数位长度,则会在小数后面用零填充显示;
       # 若插入数据的小数位长度刚好达到指定的小数位长度,则不会用零填充,也不会四舍五入;
       # 若插入数据的小数位长度已经超过指定的小数位长度,则会进行四舍五入;
       
    mysql> desc test43_2;
    +-------+-----------------------+------+-----+---------+-------+
    | Field | Type                  | Null | Key | Default | Extra |
    +-------+-----------------------+------+-----+---------+-------+
    | d     | decimal(5,2) unsigned | YES  |     | NULL    |       |
    +-------+-----------------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    
    #### 插入测试数据
    insert into test43_2(d) values(1751.2);
    		# 成功且有警告,按理说,整数位已经超过指定的长度3了,但sql_mode未开严格模式
    		# 数据会到达表中,到表中的数据是999.99
    
    insert into test43_2(d) values(-175.2);
    		# 成功且有警告,按理说,整数位应该是正整数,因为字段加了unsigned属性,但示开严格模
    		# 式,数据会到达表,到表中的数据是0.00
    
    insert into test43_2(d) values(17.2);
            # 成功,插入到表中的数据是17.2,显示的时候是17.20,因为小数位长度不够2位,
            # 会在后面用零填充显示;
    
    insert into test43_2(d) values(17.245);
            # 成功,到表中的数据不是17.245,因为小数位超过指定的长度2了,会进行四舍五入
            # 最后到表中的数据是17.25,显示的时候也是17.25
    
    mysql> select * from test43_2;
    +--------+
    | d      |
    +--------+
    | 999.99 |
    |   0.00 |
    |  17.20 |
    |  17.25 |
    +--------+
    4 rows in set (0.00 sec)
    

    4.4 测试zerofill属性

    注意:加上zerofill会把unsigned也给带上,它针对整数位(只能插入正整数),会前导0填充

    sql_mode开启了严格模式,即sql_mode参数中包含strict_trans_tables

    #### 当前会话模式下,sql_mode开启严格模式,DML语句自动提交
    set session autocommit=on;
    set session sql_mode="strict_trans_tables";
    
    
    #### 创建test44_1表,并查看其表结构
    create table if not exists test44_1(
      d decimal(5,2) zerofill
    )engine=innodb character set utf8 collate utf8_general_ci;
    
       # f字段整数位的最大长度是3,小数位的最大长度是2;
       # 加了unsigned属性,那么整数位只能是正整数;
       # 若插入数据的小数位长度没有达到指定的小数位长度,则会在小数后面用零填充显示;
       # 若插入数据的小数位长度刚好达到指定的小数位长度,则不会用零填充,也不会四舍五入;
       # 若插入数据的小数位长度已经超过指定的小数位长度,则会进行四舍五入;
       
    mysql> desc test44_1;
    +-------+--------------------------------+------+-----+---------+-------+
    | Field | Type                           | Null | Key | Default | Extra |
    +-------+--------------------------------+------+-----+---------+-------+
    | d     | decimal(5,2) unsigned zerofill | YES  |     | NULL    |       |
    +-------+--------------------------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    
    #### 插入测试数据
    insert into test44_1(d) values(1751.2);
    		# 直接报错,因为插入数值的整数位超过了指定的长度3位,且开启了严格模式
    		# 数据不会到达表中
    
    insert into test44_1(d) values(-175.2);
    		# 直接报错,因为加了zerofill,整数位只能是正整数,且sql_mode开启了严格模式,
    		# 数据不会到达表中
    
    insert into test44_1(d) values(17.2);
            # 成功,插入到表中的数据是17.2,显示的时候是017.20,因为小数位长度不够2位,
            # 会在后面用零填充显示;显示的结果是017.20
    
    insert into test44_1(d) values(17.245);
            # 成功,到表中的数据不是17.245,因为小数位超过指定的长度2了,会进行四舍五入
            # 最后到表中的数据是17.25,显示的时候是017.25
    
    mysql> select * from test44_1;
    +---------+
    | d       |
    +---------+
    |  017.20 |
    |  017.25 |
    +---------+
    3 rows in set (0.00 sec)
    

    sql_mode未开启严格模式,即sql_mode参数中不包含strict_trans_tables

    #### 当前会话模式下,sql_mode不开启严格模式,DML语句自动提交
    set session autocommit=on;
    set session sql_mode="";
    
    
    #### 创建test15_1表,并查看其表结构
    create table if not exists test44_2(
      d decimal(5,2) zerofill
    )engine=innodb character set utf8 collate utf8_general_ci;
    
       # f字段整数位的最大长度是3,小数位的最大长度是2;
       # 加了unsigned属性,那么整数位只能是正整数;
       # 若插入数据的小数位长度没有达到指定的小数位长度,则会在小数后面用零填充显示;
       # 若插入数据的小数位长度刚好达到指定的小数位长度,则不会用零填充,也不会四舍五入;
       # 若插入数据的小数位长度已经超过指定的小数位长度,则会进行四舍五入;
    
    mysql> desc test44_2;
    +-------+--------------------------------+------+-----+---------+-------+
    | Field | Type                           | Null | Key | Default | Extra |
    +-------+--------------------------------+------+-----+---------+-------+
    | d     | decimal(5,2) unsigned zerofill | YES  |     | NULL    |       |
    +-------+--------------------------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    
    #### 插入测试数据
    insert into test44_2(d) values(1751.2);
    		# 成功且有警告,按理说,整数位已经超过指定的长度3了,但sql_mode未开严格模式
    		# 数据会到达表中,到表中的数据是999.99
    
    insert into test44_2(d) values(-175.2);
    		# 成功且有警告,按理说,整数位应该是正整数,因为字段加了unsigned属性,但示开严格模
    		# 式,数据会到达表,到表中的数据是000.00
    
    insert into test44_2(d) values(17.2);
            # 成功,插入到表中的数据是17.2,显示的时候是017.20,因为小数位长度不够2位,
            # 会在后面用零填充显示;最终显示的结果是:017.20
    
    insert into test44_2(d) values(17.245);
            # 成功,到表中的数据不是17.245,因为小数位超过指定的长度2了,会进行四舍五入
            # 最后到表中的数据是17.25,显示的时候也是017.25
    
    mysql> select * from test44_2;
    +--------+
    | d      |
    +--------+
    | 999.99 |
    | 000.00 |
    | 017.20 |
    | 017.25 |
    +--------+
    4 rows in set (0.00 sec)
    

    4.5 测试不加unsigned/zerofill属性

    注意:不加unsigned/zerofill属性,整数位就可以是正整数和负整数

    sql_mode开启了严格模式,即sql_mode参数中包含strict_trans_tables

    #### 当前会话模式下,sql_mode开启严格模式,DML语句自动提交
    set session autocommit=on;
    set session sql_mode="strict_trans_tables";
    
    
    #### 创建test45_1表,并查看其表结构
    create table if not exists test45_1(
      d decimal(5,2)
    )engine=innodb character set utf8 collate utf8_general_ci;
    
       # f字段整数位的最大长度是3,小数位的最大长度是2;
       # 没有加unsigned/zerofill属性,那么整数位可以是正整数和负整数
       # 若插入数据的小数位长度没有达到指定的小数位长度,则会在小数后面用零填充显示;
       # 若插入数据的小数位长度刚好达到指定的小数位长度,则不会用零填充,也不会四舍五入;
       # 若插入数据的小数位长度已经超过指定的小数位长度,则会进行四舍五入;
    
    mysql> desc test45_1;
    +-------+--------------+------+-----+---------+-------+
    | Field | Type         | Null | Key | Default | Extra |
    +-------+--------------+------+-----+---------+-------+
    | d     | decimal(5,2) | YES  |     | NULL    |       |
    +-------+--------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    
    #### 插入测试数据进行测试
    insert into test45_1(d) values(1751.2);
    		# 直接报错,因为整数位超过了指定的长度3位,且开启了严格模式
    		# 所以会直接报错,数据不会到达表中
    
    insert into test45_1(d) values(-175.2);
    		# 成功,因为没加unsigned/zerofill属性,整数位是可以插入正整数和负整数的
    		# 整数位达到了指定长度,小数位没有达到指定长度(后面0填充)
    		# 最终的结果是:-175.20
    
    insert into test45_1(d) values(17.2);
            # 成功,因为没加unsigned/zerofill属性,整数位是可以插入正整数和负整数的
            # 整数位在指定长度范围内,小数位没有达到指定长度(后面0填充)
            # 最终的显示结果是:17.20
    
    insert into test45_1(d) values(17.245);
            # 成功,因为没加unsigned/zerofill属性,整数位是可以插入正整数和负整数的
            # 整数位在指定长度范围内,小数位超过了指定长度会四舍五入
            # 最终的结果是:17.25
    
    mysql> select * from test45_1;
    +---------+
    | d       |
    +---------+
    | -175.20 |
    |   17.20 |
    |   17.25 |
    +---------+
    3 rows in set (0.00 sec)
    

    sql_mode未开启严格模式,即sql_mode参数中不包含strict_trans_tables

    #### 当前会话模式下,sql_mode不开启严格模式,DML语句自动提交
    set session autocommit=on;
    set session sql_mode="";
    
    
    #### 创建test45_2表,并查看其表结构
    create table if not exists test45_2(
      d decimal(5,2)
    )engine=innodb character set utf8 collate utf8_general_ci;
    
       # f字段整数位的最大长度是3,小数位的最大长度是2;
       # 没有加unsigned/zerofill属性,那么整数位可以是正整数和负整数
       # 若插入数据的小数位长度没有达到指定的小数位长度,则会在小数后面用零填充显示;
       # 若插入数据的小数位长度刚好达到指定的小数位长度,则不会用零填充,也不会四舍五入;
       # 若插入数据的小数位长度已经超过指定的小数位长度,则会进行四舍五入;
    
    mysql> desc test45_2;
    +-------+--------------+------+-----+---------+-------+
    | Field | Type         | Null | Key | Default | Extra |
    +-------+--------------+------+-----+---------+-------+
    | d     | decimal(5,2) | YES  |     | NULL    |       |
    +-------+--------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    
    #### 插入测试数据进行测试
    insert into test45_2(d) values(1751.2);
    		# 成功且有警告,因为没加unsigned/zerofill属性,整数是可以插入正整数和负整数的
    		# 整数位超过了指定长度,但未开启严格模式
    		# 所以最终的结果是:999.99
    
    insert into test45_2(d) values(-175.2);
    		# 成功,因为没加unsigned/zerofill属性,整数位是可以插入正整数和负整数的
    		# 整数位达到了指定长度,小数位没有达到指定长度(后面0填充)
    		# 最终的结果是:-175.20
    
    insert into test45_2(d) values(17.2);
            # 成功,因为没加unsigned/zerofill属性,整数位是可以插入正整数和负整数的
            # 整数位在指定长度范围内,小数位没有达到指定长度(后面0填充)
            # 最终的显示结果是:17.20
    
    insert into test45_2(d) values(17.245);
            # 成功,因为没加unsigned/zerofill属性,整数位是可以插入正整数和负整数的
            # 整数位在指定长度范围内,小数位超过了指定长度会四舍五入
            # 最终的结果是:17.25
    
    mysql> select * from test45_2;
    +---------+
    | d       |
    +---------+
    |  999.99 |
    | -175.20 |
    |   17.20 |
    |   17.25 |
    +---------+
    4 rows in set (0.00 sec)
    
    展开全文
  • 小数数据类型float

    千次阅读 2020-05-06 14:30:51
    文章目录1.1 float的总结1.2 实践一(看一看float的小数位精确度)1.3 实践二(float指定M和D,加unsigned)1.4 实践三(float指定M和D,加zerofill)) 1.1 float的总结 #### 格式 id float(M,D) unsigned zerofill 字段...

    1.1 float的总结

    1

    #### 格式
    id     float(M,D)                         unsigned                 zerofill
    字段名  数据类型(建表地要指定M和D,根据你的业务)  无符号(整数位只能是正整数)   无符号(包含unsigned,整数位    不会前导0填充)
    
    #### float的M和D说明和示例
    M:表示"整数位""小数位"共多少位,M最大255位(包含小数位在内,小数30位),所以整数位最大长度是225;
    D:表示"小数位"最大多少位,最大30位;
    示例1:float(255,30)   # 整数位最大长度225位,小数位最大长度30位;
    示例2:float(50,20)    # 整数位最大长度30位,小数位最大长度20位;
    
    
    #### float关于小数的四舍五入(看一看小数位的最大精度)
    例1:f float(255,30)  例2:f float(255,30) unsigned  例3:f float(255,30) zerofill
    插入数据:insert into test12(f) values(1.555555555555555555555555555555);
            # 结果是:1.555555582046508800000000000000
            # 可以看出小数位的第8位就不准确了,只准确到了第7位小数位;
    
    ####  unsigned/zerofill实践(且为float指定整数位和小数位长度)
    例1:f float(5,2) unsigned      例2:f float(5,2) zerofill
    说明点一:float(5,2)
    01:f字段的值的"整数位"最大长度是3位,"小数位"的长度最大是2位;
    02:只要"整数位"的长度超过3位(sql_mode严格模式,直接报错;sql_mode未严格,警告,到表中的数据是999.99)
    03:若只有"小数位"的长度超过2位(小数会根据第3位进行四舍五入,但小数最终只显示2位,不管你的sql_mode是否开启严格模式)
    04:若"小数位"的长度不够2位时,在"小数位"后面用0填充来显示
    
    说明点二:unsigned和zerofill
    01:表示f字段的值的"整数位"只能是"正整数"
    02:当有zerofill时,不管sql_mode有没有开启严格模式,"整数位"的长度都不会前导0填充显示
    
    
    ####  无unsigned/zerofill(且为float指定整数位和小数位长度)
    例1:f float(5,2)
    说明点一:float(5,2)
    01:f字段的值的"整数位"最大长度是3位,"小数位"的长度最大是2位;
    02:只要"整数位"的长度超过3位(sql_mode严格模式,直接报错;sql_mode未严格,警告,到表中的数据是999.99)
    03:若只有"小数位"的长度超过2位(小数会根据第3位进行四舍五入,但小数最终只显示2位,不管你的sql_mode是否开启严格模式)
    04:若"小数位"的长度不够2位时,在"小数位"后面用0填充来显示
    
    说明点二:无unsigned和zerofill
    表示f字段的值的"整数位"可以是"正整数""负整数"
    

    1.2 实践一(看一看float的小数位精确度)

    总结

    字段定义:f float(255,30)  
    插入数据:insert into test13(f) values(1.555555555555555555555555555555);
              # 结果是:1.555555582046508800000000000000
              # 可以看出小数位的第8位就不准确了,只准确到了第7位小数位;
    

    实践

    ## 创建test12表
    create table if not exists test12(
    	f float(255,30)
    )engine=innodb character set utf8 collate utf8_general_ci comment"测试表12";
    
    ## 查看tst12表的表结构
    mysql> desc test12;
    +-------+---------------+------+-----+---------+-------+
    | Field | Type          | Null | Key | Default | Extra |
    +-------+---------------+------+-----+---------+-------+
    | f     | float(255,30) | YES  |     | NULL    |       |
    +-------+---------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    ## 插入测试数据
    mysql> insert into test12(f) values(1.555555555555555555555555555555);
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from test12;
    +----------------------------------+
    | f                                |
    +----------------------------------+
    | 1.555555582046508800000000000000 |
    +----------------------------------+
    1 row in set (0.00 sec)
    

    1.3 实践二(float指定M和D,加unsigned)

    SQL模式开启了严格模式

    ## 设置当前会话模式下sql_mode包含严格模式(即包含STRICT_TRANS_TABLES变量)
    mysql> set session sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select @@sql_mode\G
    *************************** 1. row ***************************
    @@sql_mode: STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    1 row in set (0.00 sec)
    
    ## 创建test13_1表
    create table if not exists test13_1(
      f float(5,2) unsigned
    )engine=innodb character set utf8 collate utf8_general_ci comment"测试表13_1";
    
       ## 说明点一:float(5,2)
        01:f字段指定了float(5,2),"整数位"最大长度最大3位,"小数位"最大长度2位
        02:当整数位的长度不够3位长度时,不会前导0填充进行显示,加zerofill也不会前导0填充
        03:当小数位的长度不够2位长度时,不会前导0填充进行显示,会在小数后用0补充来显示;
    
        04:只要整数位的长度超过3时,会直接报错(因为sql_mode开启了严格模式),数据不会到表中
        05:若只有小数位的长度超过2时,会根据小数位的第3位进行四舍五入,但最终显示的还是2位
    
        ## 说明点二:unsigned
        因为加了无符号(unsigne)限制,所以f字段的值的整数位只能是"正整数";
    
    ## 查看test13_1表的表结构
    mysql> desc test13_1;
    +-------+---------------------+------+-----+---------+-------+
    | Field | Type                | Null | Key | Default | Extra |
    +-------+---------------------+------+-----+---------+-------+
    | f     | float(5,2) unsigned | YES  |     | NULL    |       |
    +-------+---------------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    
    ## 插入数据测试"说明点一"和"说明点二"
    insert into test13_1(f) values(17.5);    # 结果:17.50
    insert into test13_1(f) values(170.50);  # 结果:170.50
    insert into test13_1(f) values(170.56);  # 结果:170.56
    insert into test13_1(f) values(170.566); # 结果:170,57(小数位第3位的6四舍五入)
    insert into test13_1(f) values(1777.56); # 报错(sql_mode开启了严格模式),数据不会到表中
    
    ## 查看test13_1表中的全部数据
    mysql> select * from test13_1;
    +--------+
    | f      |
    +--------+
    |  17.50 |
    | 170.50 |
    | 170.56 |
    | 170.57 |
    +--------+
    4 rows in set (0.00 sec)
    

    SQL_MODE未开启严格模式

    ## 设置当前会话模式下sql_mode不包含严格模式(即不包含STRICT_TRANS_TABLES变量)
    mysql> set session sql_mode="NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select @@sql_mode\G
    *************************** 1. row ***************************
    @@sql_mode: NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    1 row in set (0.00 sec)
    
    ## 创建test13_2表
    create table if not exists test13_2(
      f float(5,2) unsigned
    )engine=innodb character set utf8 collate utf8_general_ci comment"测试表13_2";
    
        ## 说明点一:float(5,2)
        01:f字段指定了float(5,2),"整数位"最大长度最大3位,"小数位"最大长度2位
        02:当整数位的长度不够3位长度时,不会前导0填充进行显示,加zerofill也不会前导0填充
        03:当小数位的长度不够2位长度时,不会前导0填充进行显示,会在小数后用0补充来显示;
    
        04:若要整数位的长度超过3时,不会直接报错(因为sql_mode未开启了严格模式),最终到表中的数据是999.99
        05:若只有小数位的长度超过2时,会根据小数位的第3位进行四舍五入,但最终显示的还是2位
    
        ## 说明点二:unsigned
        因为加了无符号(unsigne)限制,所以f字段的值的整数位只能是"正整数";
      
    ## 查看test13_2表的表结构
    mysql> desc test13_2;
    +-------+---------------------+------+-----+---------+-------+
    | Field | Type                | Null | Key | Default | Extra |
    +-------+---------------------+------+-----+---------+-------+
    | f     | float(5,2) unsigned | YES  |     | NULL    |       |
    +-------+---------------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    ## 插入数据测试"说明点二"和"说明点三"
    insert into test13_2(f) values(17.5);     # 结果:17.50
    insert into test13_2(f) values(170.50);   # 结果:170.50
    insert into test13_2(f) values(170.56);   # 结果:170.56
    insert into test13_2(f) values(170.566);  # 结果:170,57(小数位第3位的6四舍五入)
    insert into test13_2(f) values(1777.56);  # 警告(sql_mode未开启了严格模式),到表中的数
    # 据为999.99
    
    ## 查看test13_2表中的全部数据
    mysql> select * from test13_2;
    +--------+
    | f      |
    +--------+
    |  17.50 |
    | 170.50 |
    | 170.56 |
    | 170.57 |
    | 999.99 |
    +--------+
    5 rows in set (0.00 sec)
    

    1.4 实践三(float指定M和D,加zerofill))

    SQL_MODE开启了严格模式

    ## 设置当前会话模式下sql_mode包含严格模式(即包含STRICT_TRANS_TABLES变量)
    mysql> set session sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select @@sql_mode\G
    *************************** 1. row ***************************
    @@sql_mode: STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    1 row in set (0.00 sec)
    
    ## 创建test14_1表
    create table if not exists test14_1(
      f float(5,2) zerofill
    )engine=innodb character set utf8 collate utf8_general_ci comment"测试表14_1";
    
        ## 说明点一:float(5,2)
        01:f字段指定了float(5,2),"整数位"最大长度最大3位,"小数位"最大长度2位
        02:当整数位的长度不够3位长度时,不会前导0填充进行显示,加zerofill也不会前导0填充
        03:当小数位的长度不够2位长度时,不会前导0填充进行显示,会在小数后用0补充来显示;
    
        04:只要整数位的长度超过3时,会直接报错(因为sql_mode开启了严格模式),数据不会到表中
        05:若只有小数位的长度超过2时,会根据小数位的第3位进行四舍五入,但最终显示的还是2位
    
         ## 说明点二:unsigned
        因为加了无符号(unsigne)限制,所以f字段的值的整数位只能是"正整数";
    
    ## 查看test14_1表的表结构
    mysql> desc test14_1;
    +-------+------------------------------+------+-----+---------+-------+
    | Field | Type                         | Null | Key | Default | Extra |
    +-------+------------------------------+------+-----+---------+-------+
    | f     | float(5,2) unsigned zerofill | YES  |     | NULL    |       |
    +-------+------------------------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    
    ## 插入数据测试"说明点一"和"说明点二"
    insert into test14_1(f) values(17.5);    # 结果:17.50
    insert into test14_1(f) values(170.50);  # 结果:170.50
    insert into test14_1(f) values(170.56);  # 结果:170.56
    insert into test14_1(f) values(170.566); # 结果:170,57(小数位第3位的6四舍五入)
    insert into test14_1(f) values(1777.56); # 报错(sql_mode开启了严格模式),数据不会到表中
    
    ## 查看test14_1表中的全部数据
    mysql> select * from test14_1;
    +--------+
    | f      |
    +--------+
    |  17.50 |
    | 170.50 |
    | 170.56 |
    | 170.57 |
    +--------+
    4 rows in set (0.00 sec)
    

    SQL_MODE未开启严格模式

    ## 设置当前会话模式下sql_mode不包含严格模式(即不包含STRICT_TRANS_TABLES变量)
    mysql> set session sql_mode="NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select @@sql_mode\G
    *************************** 1. row ***************************
    @@sql_mode: NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    1 row in set (0.00 sec)
    
    ## 创建test14_2表
    create table if not exists test14_2(
      f float(5,2) zerofill
    )engine=innodb character set utf8 collate utf8_general_ci comment"测试表14_2";
    
        ## 说明点一:float(5,2)
        01:f字段指定了float(5,2),"整数位"最大长度最大3位,"小数位"最大长度2位
        02:当整数位的长度不够3位长度时,不会前导0填充进行显示,加zerofill也不会前导0填充
        03:当小数位的长度不够2位长度时,不会前导0填充进行显示,会在小数后用0补充来显示;
    
        04:若要整数位的长度超过3时,不会直接报错(因为sql_mode未开启了严格模式),最终到表中的数据是999.99
        05:若只有小数位的长度超过2时,会根据小数位的第3位进行四舍五入,但最终显示的还是2位
    
        ## 说明点二:unsigned
        因为加了无符号(unsigne)限制,所以f字段的值的整数位只能是"正整数";
      
    ## 查看test14_2表的表结构
    mysql> desc test14_2;
    +-------+------------------------------+------+-----+---------+-------+
    | Field | Type                         | Null | Key | Default | Extra |
    +-------+------------------------------+------+-----+---------+-------+
    | f     | float(5,2) unsigned zerofill | YES  |     | NULL    |       |
    +-------+------------------------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    ## 插入数据测试"说明点二"和"说明点三"
    insert into test14_2(f) values(17.5);     # 结果:17.50
    insert into test14_2(f) values(170.50);   # 结果:170.50
    insert into test14_2(f) values(170.56);   # 结果:170.56
    insert into test14_2(f) values(170.566);  # 结果:170,57(小数位第3位的6四舍五入)
    insert into test14_2(f) values(1777.56);  # 警告(sql_mode未开启了严格模式),到表中的数
    # 据为999.99
    
    ## 查看test14_2表中的全部数据
    mysql> select * from test14_2;
    +--------+
    | f      |
    +--------+
    |  17.50 |
    | 170.50 |
    | 170.56 |
    | 170.57 |
    | 999.99 |
    +--------+
    5 rows in set (0.00 sec)
    
    展开全文
  • 在本篇文章里小编给大家分享的是关于c语言double类型默认输出小数几位的相关知识点,需要的朋友们可以学习下。
  • mysql数据库小数类型

    千次阅读 2021-02-06 01:21:34
    mysql数据库小数类型云服务器(Elastic Compute Service,简称ECS)是阿里云提供的性能卓越、稳定可靠、弹性扩展的IaaS(Infrastructure as a Service)级别云计算服务。云服务器ECS免去了您采购IT硬件的前期准备,让您...
  • 前言在开发过程中,我们往往会用到decimal数据类型。因为decimal是MySQL中存在的精准数据类型。MySQL中的数据类型有:float,double等非精准数据类型和decimal这种精准。区别:float,double等非精准类型,在DB中保存...
  • 一.小数型 包括两种类型:1.浮点型 Float(M,D)2....3.小数中的M与所存数据的大小有必然关系,假如 申请类型为:float(6,2):其中,6代表小数类型包括小数点在内为6为,其中2代表小数位,因此...
  • MySQL数据类型-数值类型 (整数 小数)

    千次阅读 2021-01-13 00:31:41
    MySQL支持多种类型,不同的数据类型提供不同的取值范围,可以存储的值范围越大,所需的存储空间也会越大。大致可以分为四类:数值、日期/时间、字符串(字符)和二进制类型。 数值类型 MySQL支持所有标准SQL数值数据...
  • 今天开发碰到个需求就是保证回显到页面的数据保留两位小数,实际我们的数据是八位小数 可以明显...第二个参数是double数据类型,String,int,Long 类型是不行的,float可以2.返回的数据类型是Bigdecimal2.1 方法一j...
  • C#中值的小数类型

    千次阅读 2019-08-10 11:45:05
    小数类型(decimal)类型数据是高精度的类型数据,占用16个字节(128位),主要为了满足需要高精度的财务和金融计算领域。小数类型数据的取值范围和精度如下: 小数类型数据的范围远远小于浮点类型,不过它的精度比...
  • C++小数该用什么数据类型

    万次阅读 2018-05-09 12:01:36
    1. 单精度,float a = 12; printf("%f ", a); 输出 : 12.000000 2. 双精度,double a = 12; printf("%f %lf", a, a); 输出:12.000000 12.000000 ... 所以需要将 a, b定义为浮点类型float或double
  • Hive 数据类型

    千次阅读 2018-10-09 18:30:37
    可以指定使用整型数据类型,下表描述了各种INT数据类型。 (TINYINT&amp;amp;amp;lt;SMALLINT&amp;amp;amp;lt;INT&amp;amp;amp;lt; BIGINT) 类型 (后缀) 示例 TINYINT (Y) 10Y ...
  • 在我们的开发过程中,经常会遇到有的String类型带小数的值要求转化为Integer类型不带小数的值,这时候我们有的转化就会出问题。这里,我们应用这样的方法来进行转化: 带小数的String转数字用Number num = ...
  • 数据类型(列类型) 所谓的数据类型: 对数据进行统一的分类, 从系统的角度出发为了能够使用统一的方式进行管理: 更好的利用有限的空间. SQL中将数据类型分成了三大类: 数值类型, 字符串类型和时间日期类型 数值型 ...
  • Java基本数据类型
  • Oracle数据库 小数类型创建

    千次阅读 2020-09-16 14:26:46
    在Oracle数据库如果有小数类型可以用float和decimal float 准确度比较低一些 decimal 准确度高一些
  • Java的基本数据类型

    千次阅读 2021-03-11 12:10:33
    一、基本数据类型Java有八大基本数据类型分别是:表示整数的类型,表示小数的类型,表示字符的类型(不是字符串类型,要区分来),表示布尔类型的类型。以上是Java的八种基本数据类型,其中要注意的String(字符串)在...
  • 整数类型 默认为 int 带小数的默认为 double boolean的默认值 false
  • MySQL数据类型(整型,浮点型)

    千次阅读 2021-01-14 12:51:13
    MySQL数据类型:desc 查看列和数据的类型(表结构)整数型:存放整型数据tinyint:迷你整型,使用1个字节存储,表示的状态最多为256种(常用) 有符号 (-128-127)无符号(0-255)smallint:小整型,使用2个字节存储,表示...
  • Java处理带小数的数字

    千次阅读 2018-11-10 15:52:36
    ava中提供了浮点数float和double类型表示小数计算,但是设计这2类型主要是为了科学计算和工程设计而设计的。 因此,并没有提供完全精确的结果,所以应该被用于需要精确结果的场合。特别是货币计算 正确的使用...
  • 第2章 基本数据类型

    千次阅读 2020-12-08 10:06:23
    2.1 数字类型2.1.1 整数类型整数类型有4种进制表示:十进制、二进制、八进制和十六进制。默认情况下,整数使用十进制,其他进制需要...2.1.2 浮点数类型Python 语言要求所有浮点数必须小数小数部分可以是0。浮...
  • 浮点数类型:必须小数部分,小数部分可以是0,例如1010.0。表示方法有一般表示(只有十进制)和科学计数法。数值范围和小数精度受不同计算机系统的限制,一般认为没有范围限制。有确定尾数。 #科学计数法 ...
  • Python数据类型(一)

    千次阅读 2020-11-24 23:49:43
    类型的概念之所以要对数据进行进行类型的划分,这是因为对于一个简单的数据来说,从不同的角度看,数据会有不同的含义。例如这样一个数据:110,010,011。有多少含义呢?(1)当我们看到这样一个数据,我们对它的第一...
  • 02_星仔你学Java之变量、常量、字面量、数据类型

    千次阅读 多人点赞 2022-03-08 20:33:40
    二、数据类型 1、数据类型概念 2、基本数据类型 3、引用数据类型 三、基本数据类型转换 自动类型转换,也称为“隐式类型转换 强制类型转换,也称为“显示类型转换” 表达式类型的自动提升 四、面试题 1、以下变量...
  • Python小数/浮点数(float)类型详解

    千次阅读 2020-12-06 04:39:16
    如果小数点动,就称为定点数。Python中的小数有两种书写形式:1) 十进制形式这种就是我们平时看到的小数形式,例如 34.6、346.0、0.346。书写小数时必须包含一个小数点,否则会被 Python 当作整数处理。2) 指数...
  • Python基础(一)_基本数据类型及操作Python基础(一)_基本数据类型及操作一:基本数据类型及操作(一)基本数据类型1.整数类型整数类型一共有4种进制表示:十进制、二进制、八进制和十六进制默认情况,整数采用十进制,...
  • 浮点型又称之为精度类型:是一种有可能丢失精度的数据类型,数据有可能那么准确(由其是在超出范围的时候) 浮点型之所以能够存储较大的数值(精确),原因就是利用存储数据的位来存储指数 整型:所有位都为...
  • Oracle数据类型

    千次阅读 2021-04-30 11:24:55
    1、字符类型• CHAR:一个定长字符串,当位数不足自动用空格填充来达到其最大长度。如非NULL的CHAR(12)总是包含12字节信息。CHAR字段最多可以存储2,000字节的信息。• VARCHAR2:目前这也是VARCHAR 的同义词。这是一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 89,360
精华内容 35,744
关键字:

不可以带小数的数据类型

友情链接: sense_ride.zip