关于MYSQL中浮点数和双精度数类型的存储

  关于MYSQL中浮点数和双精度数类型的存储
  
  
  其实在单精度和双精度浮点类型存储中其存储方式和C/c++一致准守IEEE标准他们都是浮点型的,所谓的浮点型,是小数点的位置可变,其能够表示的范围比定点小数要广得多,而存储空间节省,但是受到精度的影响,所以在严格的数据中尽量使用定点小mysql十进制数(m, d)类型,甲骨文压根没有浮点数字类型而是数量(p, s)定点小数,
  
  浮动4字节
  ,,1,,,8,,,23日
  ,符号位,指数位尾数
  
  双8字节
  ,,1,,,11,,52
  ,,符号位,指数位,尾数
  那么很明显他们的精度取决于尾数。
  而表示的范围取决于指数。
  
  浮表示范围:
  2 ^ 8=(128 - 127)
  2 ^ 128 - 2 ^ 127,
  e38约为-3.4 - 3.4 e38
  双表示范围:
  2 ^ 11=(1024 - 1023)
  2 ^ 1024 - 1023 ^
  e308约为-1.7 - 1.7 e308
  可以看到这个范围实际上很广,但是精度确很小
  浮精度:
  漂尾数23位,2 ^ 23=8.3 e6, 6 - 7位
  双尾数52位,2 ^ 52=4.5 e15 14日至15日位
  
  那么如果使用浮点数据保存了精度大于其范围的数据其会使用四舍五入的方法截断。
  MYSQL如下:
  mysql>创建表dname (id1浮动,id2双,名字varchar (20));
  查询好,0行影响(0.08秒)
  mysql>插入dname值(1234567.123,1234567.123,“高朋网”),
  查询好了,1行影响(0.00秒)
  mysql>提交;
  查询好,0行影响(0.00秒)
  mysql>select * from dname;
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
  | id1,,| id2,,,,|名称,,|
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
  | 1234570 | 1234567.123 |高朋网|
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
  1行集(0.00秒)
  虽然进行了四舍五入,但是不会有任何报错和警告,这是其标准决定的而不是数据库本生。
  可以看到1234567.123在浮动下被四舍五入为1234570,而两类型没有问题,那么我们
  直接从数据文件中提取数据。
  我还是使用了自己写的小工具BCVIEW
  [root@hadoop1测试]# bcview dname。ibd 16 127年40
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  这个工具是找到数据以二进制格式问题(十六进制)
  用法:。/bcview文件blocksize抵消cnt-bytes !,,,,,,,,,,
  文件:是你的文件将数据!,,,,,,,,,,,,,,,
  blocksize: N kb的块。8是8 Kb Blocksize (Oracle) !,,,,,
  ,,,,,,,,,,,,,如:16 16 Kb Blocksize (Innodb) !,,,,
  偏移量:每一块偏移量是你要开始!,,,,,,,,,,,,,,,,,,,
  cnt-bytes:抵消后,多字节要得到!,,,,,,,,,,,,,,,,
  Edtor QQ: 22389860 !,,,,,,,,,,,,,,,,,,,,,,,,
  使用gcc版本4.1.2 20080704 (Red Hat 4.1.2-46),,,,,,,,
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  ——当前文件大小:0.093750 Mb
  ——当前使用集blockszie 16 Kb
  当前块:00000000——00127年的抵消:问字节:40——数据:00 ffffffff0000000000010000000200260000000200260000000000000000ffffffff0000ffffff
  当前块:00000001——00127年的抵消:问字节:40 -数据:00000000000000000000000000000000000000000000000000000000000000000000000000000000
  当前块:00000002——00127年的抵消:问字节:40——数据:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
  当前块:00000003——00127年的抵消:问字节:40 -数据:000001 cc6d090000002d5679ab00000d0c011039b4964991ed7c1f87d6324167616f70656e670000
  当前块:00000004——00127年的抵消:问字节:40 -数据:00000000000000000000000000000000000000000000000000000000000000000000000000000000
  当前块:00000005——00127年的抵消:问字节:40 -数据:00000000000000000000000000000000000000000000000000000000000000000000000000000000
  
  实际的数据是
  000001 cc6d09,,,,rowid,,,,,
  0000002 d5679ab,,,事物ID,,,,,
  00000 d0c0110,,,,回滚指针,,,,,
  39 b49649,,,,,,1234570,,,,
  91年ed7c1f87d63241,,1234567.123,,
  67616 f70656e67,,,“高朋网”,,,
  关于如何得到数据的可以参考我的博文
  http://blog.itpub.net/7728585/viewspace-2071787/

关于MYSQL中浮点数和双精度数类型的存储