我的编程空间,编程开发者的网络收藏夹
学习永远不晚

关于MYSQL中FLOAT和DOUBLE类型的存储

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

关于MYSQL中FLOAT和DOUBLE类型的存储

关于MYSQL中FLOAT和DOUBLE类型的存储


其实在单精度和双精度浮点类型存储中其存储方式和C/C++一致准守IEEE标准他们都是浮点型的,所谓的浮点型,是小数点的位置可变,其能够表示的范围比定点小数要广得多,而存储空间节省,但是受到精度的影响,所以在严格的数据中尽量使用定点小数mysql decimal(m,d)类型,ORACLE压根没有浮点数字类型而是number(p,s)定点小数,

float 4字节
    1       8      23
  符号位   指数位 尾数

double 8字节
    1       11     52
   符号位  指数位  尾数
那么很明显他们的精度取决于尾数。
而表示的范围取决于指数。

float表示范围:
2^8=(-128—127)
-2^128—2^127 
约为-3.4E38—3.4E38
double表示范围:
2^11=(-1024—1023)
-2^1024—2^1023
约为-1.7E308—1.7E308
可以看到这个范围实际上很广,但是精度确很小
float精度:
float 尾数23位,2^23=8.3E6  6-7位
double尾数52位,2^52=4.5E15 14-15位

那么如果使用浮点数据保存了精度大于其范围的数据其会使用四舍五入的方法截断。
MYSQL如下:
mysql> create table dname(id1 float,id2 double,name varchar(20));
Query OK, 0 rows affected (0.08 sec)
mysql> insert into dname values(1234567.123,1234567.123,'gaopeng');
Query OK, 1 row affected (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from dname;
+---------+-------------+---------+
| id1     | id2         | name    |
+---------+-------------+---------+
| 1234570 | 1234567.123 | gaopeng |
+---------+-------------+---------+
1 row in set (0.00 sec)
虽然进行了四舍五入,但是不会有任何报错和警告,这是其标准决定的而不是数据库本生。
可以看到1234567.123在FLOAT下被四舍五入为1234570,而DOUBLE类型没有问题,那么我们
直接从数据文件中提取数据。
我还是使用了自己写的小工具BCVIEW
[root@hadoop1 test]# bcview dname.ibd 16 127 40
******************************************************************
This Tool Is Uesed For Find The Data In Binary format(Hexadecimal)
Usage:./bcview file blocksize offset cnt-bytes!                   
file: Is Your File Will To Find Data!                             
blocksize: Is N kb Block.Eg: 8 Is 8 Kb Blocksize(Oracle)!         
                         Eg: 16 Is 16 Kb Blocksize(Innodb)!       
offset:Is Every Block Offset Your Want Start!                                     
cnt-bytes:Is After Offset,How Bytes Your Want Gets!                               
Edtor QQ:22389860!                                                
Used gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)                
******************************************************************
----Current file size is :0.093750 Mb
----Current use set blockszie is 16 Kb
current block:00000000--Offset:00127--cnt bytes:40--data is:00ffffffff0000000000010000000200260000000200260000000000000000ffffffff0000ffffff
current block:00000001--Offset:00127--cnt bytes:40--data is:00000000000000000000000000000000000000000000000000000000000000000000000000000000
current block:00000002--Offset:00127--cnt bytes:40--data is:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
current block:00000003--Offset:00127--cnt bytes:40--data is:000001cc6d090000002d5679ab00000d0c011039b4964991ed7c1f87d6324167616f70656e670000
current block:00000004--Offset:00127--cnt bytes:40--data is:00000000000000000000000000000000000000000000000000000000000000000000000000000000
current block:00000005--Offset:00127--cnt bytes:40--data is:00000000000000000000000000000000000000000000000000000000000000000000000000000000

实际的数据是
000001cc6d09         rowid         
0000002d5679ab       事物ID          
00000d0c0110         回滚指针          
39b49649             1234570       
91ed7c1f87d63241     1234567.123   
67616f70656e67       'gaopeng'     
关于如何得到数据的可以参考我的博文
http://blog.itpub.net/7728585/viewspace-2071787/
我们来分析下float的组成,因为LINUX属于小端,存储会是反向的
39b49649实际是4996b439

49 01001001
96 10010110
b4 10110100
39 00111001

   0     10010011     00101101011010000111001
符号位   指数位             尾数

10010011=147
这里需要减去127
147-127=20为指数

尾数 00101101011010000111001需要加入一个1.
如下1.00101101011010000111001
如此我们需要将1.00101101011010000111001
乘以2的20次方实际就是右移动20位

100101101011010000111.001
整数部分
100101101011010000111=1234567这里就是最后的数据1234567
而显示的时候1234567又被四舍五入为1234570

再来看double

91ed7c1f87d63241
实际为
4132d6871f7ced91

0                          符号位
10000010011  1043 然后1043-1023=20 级指数位 
0010110101101000011100011111011111001110110110010001

1.0010110101101000011100011111011111001110110110010001
100101101011010000111.00011111011111001110110110010001


整数部分为100101101011010000111=1234567 
关于小数部分的计算:
0*2^(0-1) 第一位
0*2^(0-2) 第二位
0*2^(0-3) 第三位
1*2^(0-4)=1/16 第四位
1*2^(0-5)=1/32 第五位
1*2^(0-6)=1/64 第六位
.....
及0.123=0.0001111101111100其额外的部分为无效数字

实际上数据是没有问题的。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

关于MYSQL中FLOAT和DOUBLE类型的存储

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java中关于String类型数据的存储方式

Java中String类型数据存储在常量池中,以字符串字面量形式存在。编译时创建唯一String对象,多个引用指向同一对象。常量池还存储其他字面值,优化内存和性能。String对象包含不可变字符数组,按块对齐存储。StringBuilder和StringBuffer类提供可变字符串表示,使用可变字符数组存储内容。
java中关于String类型数据的存储方式
2024-04-10

浅谈MySQL中float、double、decimal三个浮点类型的区别与总结

下表中规划了每个浮点类型的存储大小和范围:类型大小范围(有符号)范围(无符号)用途==float==4 bytes(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38
2022-05-11

在 MySQL 数据库中存储货币值的最佳数据类型?

为了表示金钱,我们需要使用 Decimal (TotalDigitsinteger, DigitsAfterDecimalinteger) 方法。假设我们需要显示值 345.66。为此,计算有多少位可用。值345.66,一共有5位,小数点
2023-10-22

关于MYSQL 你需要知道的数据类型和操作数据表

数据类型和操作数据表 1.1 MySQL类型之整型1.2 MySQL数据类型之浮点型1.3 日期时间型 DATE 1支持时间:1000年1月1日~9999年12月31日 DATETIME 3 支持时间:1000年1月1日0时0秒~9999年
2022-06-01

数据库中的字符类型存储字符和汉字的数量

sqlServer2012(936 简体中文GBK )为例:例如:  varchar(10),只能存储10个英文字符或数字,也只能存储5个汉字;  char(10),只能存储10个英文字符或数字,也只能存储5个汉字;  nvarchar(10),即存储10个英
数据库中的字符类型存储字符和汉字的数量
2017-08-14

MySQL表类型中如何查看数据库支出的存储引擎

这期内容当中小编将会给大家带来有关MySQL表类型中如何查看数据库支出的存储引擎,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、查看当前数据库支出的存储引擎方法1:mysql> show engines
2023-06-25

深入了解Hadoop中不同存储类型的选择和应用场景

Hadoop是一个用于大规模数据处理的开源框架,它提供了多种存储类型来存储数据。在选择合适的存储类型时,需要考虑数据的访问模式、数据大小、数据的一致性和可靠性需求等因素。下面介绍几种常见的Hadoop存储类型以及它们的应用场景:HDFS(H
深入了解Hadoop中不同存储类型的选择和应用场景
2024-02-29

什么是 JDBC Blob 数据类型?如何存储和读取其中的数据?

BLOB 是二进制大对象,可以容纳可变数量的数据,最大长度为 65535 个字符。它们用于存储大量二进制数据,例如图像或其他类型的数据。文件。定义为 TEXT 的字段也保存大量数据。两者之间的区别在于,存储数据的排序和比较在 BLOB 中区
2023-10-22

编程热搜

目录