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

重庆八怪

2016-04-12

844浏览量

简介:

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

其实在单精度和双精度浮点类型存储中其存储方式和C/C++一致准守IEEE标准他们都是浮点型的,所谓的浮点型,是小数点的位置可变,其能够表示的范围比定点小数要广得多,而存储空间节省,但是受到精度的影响,所以在严格的数...

关于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其额外的部分为无效数字

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

存储

关系型数据库

MySQL

Oracle

Linux

C++

C语言

数据库

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

mysql double 存储_关于MYSQL中FLOAT和DOUBLE类型的存储-阿里云开发者社区相关推荐

  1. 存储过程mysql into select into_mysql 存储过程select into select into select的搜索结果-阿里云开发者社区...

    对一个MySQL存储过程的优化 在编写MySQL存储过程的过程中,我们会时不时地需要对某些存储过程进行优化,其目的是确保代码的可读性.正确性及运行性能.本文以作者实际工作为背景,介绍了对某一个MySQ ...

  2. 不属于python标准库的是_《Python Cookbook(第2版)中文版》——1.10 过滤字符串中不属于指定集合的字符-阿里云开发者社区...

    本节书摘来自异步社区<Python Cookbook(第2版)中文版>一书中的第1章,第1.10节,作者[美]Alex Martelli , Anna Martelli Ravenscro ...

  3. python树莓派编程 沃尔弗拉姆_《 Python树莓派编程》——3.3 Python入门-阿里云开发者社区...

    本节书摘来自华章出版社<Python树莓派编程>一书中的第3章,第3.3节,作者:[美]沃尔弗拉姆·多纳特(Wolfram Donat)著韩德强 等译,更多章节内容可以访问云栖社区&quo ...

  4. 查询mysql数据库表占用空间大小_查看 MySQL 数据库中每个表占用的空间大小-阿里云开发者社区...

    如果想知道MySQL数据库中每个表占用的空间.表记录的行数的话,可以打开MySQL的 information_schema 数据库.在该库中有一个 TABLES 表,这个表主要字段分别是: TABLE ...

  5. mysql5.5索引如何定义_MySQL5.5索引数在InnoDB引擎内与索引数在mysql中定义的数量是不一致问题-阿里云开发者社区...

    在查看MySQL错误日志的时候发现这样的错误,如下: 160322 21:42:59 [ERROR] Table baby/baby_order contains 12 indexes inside ...

  6. mysql 视图会走索引吗_MySQL视图索引与存储过程精析-阿里云开发者社区

    1.MySQL分页查询 1.1 limit函数: SELECT * FROM emp LIMIT 3 –只查询三条数据,其他忽略 1.2 select * from emp order by empn ...

  7. mysql 5.1版本无innodb trx_MySQL 5.7: Innodb 事务子系统优化-阿里云开发者社区

    MySQL5.7 : Innodb 事务子系统优化 之前写了篇博客介绍了Percona Server对Read View的优化,顺带简单提到了MySQL5.7的事务子系统优化,详细见http://my ...

  8. mysql批量插入跟更新_Mysql批量插入和更新的性能-问答-阿里云开发者社区-阿里云...

    利用Hibernate,连接池使用的是BoneCP,做了一个MySql批量插入和批量更新的Demo,出现了下面两个问题. 1.批量插入.我采用的是原生态的JDBC,每次批量插入60条数据左右(数据量不 ...

  9. cmake mysql 参数_MySQL cmake编译时这些参数是什么意思?-问答-阿里云开发者社区-阿里云...

    一般用到的参数# -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ #安装路径 # -DMYSQL_DATADIR=/usr/local/mysql/data \ # ...

  10. python集合可以修改吗_修改包含Python3中的集合的集合列表-问答-阿里云开发者社区-阿里云...

    我试图创建一个以元组为元素的列表.每个元组都有4个整数.前两个整数是对2个range进行压缩的结果,而其他2个则是对2个不同的整数进行压缩的结果. 我正在使用此代码创建元组和最终列表,这些列表是从笛卡 ...

最新文章

  1. Mediawiki随笔
  2. filter java oauth_java – 带有自定义安全过滤器的Spring Boot OAuth2
  3. python-容器数据类型-知识小结
  4. 读《程序是怎样跑起来的》第三章有感
  5. 完美运动框架封装函数startMove
  6. oracle asm结构,深入了解Oracle ASM
  7. ARM汇编:数据处理指令集:MOV、ADD、ADDS、ADC、SUB、SUBS、SBC、RSB、MUL、AND、ORR、EOR、BIC、CMP、TST、TEQ、LSL、LSR、ASR、RORV
  8. Win10有哪些方便快捷的操作小技巧?
  9. java计算机毕业设计楼宇管理系统源码+数据库+lw文档+系统
  10. 腾讯云MySQL备份本地恢复
  11. 《叶圣陶语文教育论集》的阅读笔记和读后感3400字
  12. 蓝奏云链接打不开的解决办法
  13. git restore指令和git restore --staged 的使用
  14. 使用GitHub托管网站,自定义域名
  15. Android Google Map实例 - 在地图和卫星图之间切换(Android mapview)
  16. shell中for循环,读取一整行
  17. ushort java_Java UShort类代码示例
  18. HP LaserJet M1213nf win10 64bit系统不能连接32bit系统网络打印机
  19. 联咏NT9833xSDK编译
  20. 摧毁巴士站(bus)

热门文章

  1. 显示隐藏-display(HTML、CSS)
  2. 一些常用的简单的Lambda写法
  3. React使用create-react-app 创建项目失败,解决方法
  4. Vue router-link 两种传参方法及参数的使用
  5. gitt之设置和取消代理
  6. Thymeleaf 的使用
  7. mySQL用户和权限管理v1
  8. Talking Data副总裁高铎:我们如何赋予大数据生命力
  9. 机器学习基础-朴素贝叶斯分类
  10. 【编译原理笔记04】语法分析:自顶向下的分析概述、文法转换、LL1文法