牛刀小试MySQL学习-MySQL Numeric Types之定点,浮点,位类型

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Fixed-Point Types (Exact Value) - DECIMAL, NUMERIC(定点数类型) Floating-Point Types (Approximate Value) - FLOAT, DOUBLE(浮点数类型) 一般数据库更多使用定点数类型,存储货币,因为在MySQL内部以字符串形式存放,比浮点数更精确。
Fixed-Point Types (Exact Value) - DECIMAL, NUMERIC(定点数类型)
Floating-Point Types (Approximate Value) - FLOAT, DOUBLE(浮点数类型)
一般数据库更多使用定点数类型,存储货币,因为在MySQL内部以字符串形式存放,比浮点数更精确。
适合存储货币精度高的数据。为什么浮点数据不能存储精确数据,因为浮点值在SQL表现的数据和mysql
内部展现的是不一致的。

例如: DECIMAL(5,2) => column range from -999.99  to 999.99 .
           FLOAT(7,4)     =>column range from -999.9999 to 999.9999.

插入数据都截断,且四舍五入
mysql> create table t3_test(id1 float(5,2),id2 double(5,2),id3 decimal(5,2));
Query OK, 0 rows affected (0.04 sec)

mysql> insert into t3_test values(1.23,1.23,1.23);
Query OK, 1 row affected (0.02 sec)

mysql> select * from t3_test;
+------+------+------+
| id1  | id2  | id3  |
+------+------+------+
| 1.23 | 1.23 | 1.23 |
+------+------+------+
1 row in set (0.00 sec)

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

mysql> show warnings;
+-------+------+------------------------------------------+
| Level | Code | Message                                  |
+-------+------+------------------------------------------+
| Note  | 1265 | Data truncated for column 'id3' at row 1 |
+-------+------+------------------------------------------+
1 row in set (0.00 sec)

mysql> select * From t3_test;(得到的数据是四舍五入的)
+------+------+------+
| id1  | id2  | id3  |
+------+------+------+
| 1.23 | 1.23 | 1.23 |
| 1.24 | 1.24 | 1.24 |
+------+------+------+
2 rows in set (0.00 sec)

对于精确长度的插入最好不要使用float和double,看看下面的例子就能明白了
mysql> CREATE TABLE t5 (i INT, d1 DOUBLE, d2 DOUBLE);
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO t5 VALUES (1, 101.40, 21.40), (1, -80.00, 0.00), (2, 0.00, 0.00), (2, -13.20, 0.00), (2, 59.60, 46.40), (2, 30.40, 30.40), (3, 37.00, 7.40), (3, -29.60, 0.00), (4, 60.00, 15.40), (4, -10.60, 0.00), (4, -34.00, 0.00), (5, 33.00, 0.00), (5, -25.80, 0.00), (5, 0.00, 7.20), (6, 0.00, 0.00), (6, -51.40, 0.00);

mysql> select * from t5;
+------+-------+------+
| i    | d1    | d2   |
+------+-------+------+
|    1 | 101.4 | 21.4 |
|    1 |   -80 |    0 |
|    2 |     0 |    0 |
|    2 | -13.2 |    0 |
|    2 |  59.6 | 46.4 |
|    2 |  30.4 | 30.4 |
|    3 |    37 |  7.4 |
|    3 | -29.6 |    0 |
|    4 |    60 | 15.4 |
|    4 | -10.6 |    0 |
|    4 |   -34 |    0 |
|    5 |    33 |    0 |
|    5 | -25.8 |    0 |
|    5 |     0 |  7.2 |
|    6 |     0 |    0 |
|    6 | -51.4 |    0 |
+------+-------+------+
16 rows in set (0.00 sec)

mysql> select i ,sum(d1) as a,sum(d2) as b from t5 group by i;
+------+--------------------+------+
| i    | a                  | b    |
+------+--------------------+------+
|    1 | 21.400000000000006 | 21.4 |
|    2 |  76.80000000000001 | 76.8 |
|    3 |  7.399999999999999 |  7.4 |
|    4 | 15.399999999999999 | 15.4 |
|    5 |  7.199999999999999 |  7.2 |
|    6 |              -51.4 |    0 |
+------+--------------------+------+
6 rows in set (0.03 sec)

可以发现,分组i,汇总每组的值都非常的奇怪

使用decimal试试看。

mysql> CREATE TABLE t6(i INT, d1  decimal(10,2), d2  decimal(10,2) );
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO t5 VALUES (1, 101.40, 21.40), (1, -80.00, 0.00), (2, 0.00, 0.00), (2, -13.20, 0.00), (2, 59.60, 46.40), (2, 30.40, 30.40), (3, 37.00, 7.40), (3, -29.60, 0.00), (4, 60.00, 15.40), (4, -10.60, 0.00), (4, -34.00, 0.00), (5, 33.00, 0.00), (5, -25.80, 0.00), (5, 0.00, 7.20), (6, 0.00, 0.00), (6, -51.40, 0.00);


mysql> select i ,sum(d1) as a,sum(d2) as b from t6 group by i;
+------+--------+-------+
| i    | a      | b     |
+------+--------+-------+
|    1 |  21.40 | 21.40 |
|    2 |  76.80 | 76.80 |
|    3 |   7.40 |  7.40 |
|    4 |  15.40 | 15.40 |
|    5 |   7.20 |  7.20 |
|    6 | -51.40 |  0.00 |
+------+--------+-------+
6 rows in set (0.03 sec)

上下一对比,就知道为啥要用decimal而不用浮点数类型的了。double类型做统计计算,会变得异常,decimal做计算就正常,也怪不得一个称为Exact Value,另外一个称为 Approximate Value.

Bit-Value Type - BIT(位类型)
对于BIT位类型,用户存放字段值,BIT(M)可以用来存放多位二进制数,M范围是1~64.

mysql> create table t3(id bit(1));
Query OK, 0 rows affected (0.07 sec)

mysql> insert into t3 values(1);
Query OK, 1 row affected (0.02 sec)

mysql> select * from t3;(查看不到任何的数据,由于是位类型)
+------+
| id   |
+------+
|
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2天前
|
分布式计算 关系型数据库 MySQL
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型 图像处理 光通信 分布式计算 算法语言 信息技术 计算机应用
20 8
|
26天前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
57 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
27天前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
44 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
27天前
|
Java 关系型数据库 MySQL
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
这篇文章是关于如何使用Spring Boot框架通过JdbcTemplate操作MySQL数据库的教程。
20 0
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
|
11天前
|
关系型数据库 MySQL Java
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
20 0
|
27天前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
105 6
|
1天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
11 4
|
25天前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
58 3
Mysql(4)—数据库索引
|
27天前
|
SQL Ubuntu 关系型数据库
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
64 3
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
|
10天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
49 2