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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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   |
+------+
|
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
10
分享
相关文章
mysql bit对gorm使用何种类型?
在GORM中使用MySQL的BIT类型时,通常使用 `bool`类型来处理BIT(1),使用 `[]byte`类型来处理BIT(N)(N > 1)。通过正确的类型映射和位操作,可以高效地处理位字段数据。确保在定义结构体字段时,明确指定字段类型,以便GORM能够正确地处理数据库交互。
41 18
【YashanDB 知识库】MySQL 迁移至崖山 char 类型数据自动补空格问题
问题分类】功能使用 【关键字】char,char(1) 【问题描述】MySQL 迁移至崖山环境,字段类型源端和目标端都为 char(2),但应用存储的数据为'0'、'1',此时崖山查询该表字段时会自动补充空格 【问题原因分析】mysql 有 sql_mode 控制,检查是否启用了 PAD_CHAR_TO_FULL_LENGTH SQL 模式。如果启用了这个模式,MySQL 才会保留 CHAR 类型字段的尾随空格,默认没有启动。 #查看sql_mode mysql> SHOW VARIABLES LIKE 'sql_mode'; 【解决/规避方法】与应用确认存储的数据,正确定义数据
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
本文详细介绍了MySQL中的SQL语法,包括数据定义(DDL)、数据操作(DML)、数据查询(DQL)和数据控制(DCL)四个主要部分。内容涵盖了创建、修改和删除数据库、表以及表字段的操作,以及通过图形化工具DataGrip进行数据库管理和查询。此外,还讲解了数据的增、删、改、查操作,以及查询语句的条件、聚合函数、分组、排序和分页等知识点。
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
mysql怎么查询longblob类型数据的大小
通过本文的介绍,希望您能深入理解如何查询MySQL中 `LONG BLOB`类型数据的大小,并结合优化技术提升查询性能,以满足实际业务需求。
187 6
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型 图像处理 光通信 分布式计算 算法语言 信息技术 计算机应用
82 8
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
113 42
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
63 25
数据库数据恢复——MySQL简介和数据恢复案例
MySQL数据库数据恢复环境&故障: 本地服务器,安装的windows server操作系统。 操作系统上部署MySQL单实例,引擎类型为innodb,表空间类型为独立表空间。该MySQL数据库没有备份,未开启binlog。 人为误操作,在用Delete命令删除数据时未添加where子句进行筛选导致全表数据被删除,删除后未对该表进行任何操作。
【深入了解MySQL】优化查询性能与数据库设计的深度总结
本文详细介绍了MySQL查询优化和数据库设计技巧,涵盖基础优化、高级技巧及性能监控。
339 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等