from: http://blog.csdn.net/ufojoan/article/details/27555281

可能做程序的人都知道,float 类型是可以存浮点数(即小数类型),但是 float 有个坏处,当你给定的数据是整数的时候,那么它就以整数给你处理。这样我们在存取货币值的时候自然遇到问题,我的 default 值为:0.00 而实际存储是 0,同样我存取货币为 12.00,实际存储是 12.
幸好 mysql 提供了两个数据类型:numeric 和 decimal,这两种数据类型可以轻松解决上面的问题:
NUMERIC 和 DECIMAL 类型被 MySQL 以同样的类型实现,这在 SQL92 标准中是允许的。他们用于保存对准确精度有重要要求的值,例如与金钱有关的数据。当以它们中的之一声明一个列时,精度和数值范围可以 (通常是) 被指定;例 如:

salary DECIMAL(5,2)

在这个例子中,5 (精度 (precision)) 代表重要的十进制数字的数目,2 (数据范围 (scale)) 代表在小数点后的数字位数。在这种情况下,因此,salary 列可以存储的值范围是从 -99.99 到 99.99。(实际上 MySQL 在这个列中可以存储的数值可以一直到 999.99,因为它没有存储正数的符号)。

译者注:

M 与 D 对 DECIMAL(M, D) 取值范围的影响

类型说明 取值范围(MySQL <3.23) 取值范围(MySQL>= 3.23) 


1.  DECIMAL(4, 1) -9.9 到 99.9 -999.9 到 9999.9 
2.   DECIMAL(5, 1) -99.9 到 999.9 -9999.9 到 99999.9 
3.   DECIMAL(6, 1) -999.9 到 9999.9 -99999.9 到 999999.9 
4.   DECIMAL(6, 2) -99.99 到 999.99 -9999.99 到 99999.99 
5.   DECIMAL(6, 3) -9.999 到 99.999 -999.999 到 9999.999 

在 MySQL 3.23 及以后的版本中,DECIMAL(M, D) 的取值范围等于早期版本中的 DECIMAL(M + 2, D) 的取值范围。

还有一种数据类型也是比较棒的: 那就是 LongBlob,这种数据类型可以直接把图像文件存到数据库中!

笔者,最近在研究 mysql 的 decimal 数据类型,现把数据实验结果公布如下

数据库版本: Server version: 5.0.45 Source distribution

1、创建表结构

create table  ta (a  float ,b  decimal ( 10 , 5 ));

2、插入数据

insert into  ta (a,b)  values ( 1 , 12345.123423 );

实际插入的 b 列数据为: 12345.12342

insert into  ta (a,b)  values ( 1 , 123456.1234 );

实际插入的 b 列数据为: 99999.99999

结论:decimal 数据类型,

1、当插入的整数部分的值超过了其表示范围后就直接忽略了小数部分的值,并以最大值填充。

2、当整数部分合法,小数部分多余的位数,直接截断。

二、numeric(M,D)

当看到 numeric 数字类型后,大部分都会看成了 number, 我也几次都弄错了。

numeric 数字类型和 decimal 数字类型的一样的

修改 a 列字段类型: alter table ta change a a numeric(10,5);

show  create  table  ta;  
|  ta     |  CREATE  TABLE  `ta` (  
`a`  decimal ( 10 , **5**default  NULL ,  
`b`  decimal ( **10** , **5**default  NULL  
) ENGINE = MyISAM  DEFAULT  CHARSET = utf8  |

可见,在 myslq5.0 中,numeric 和 decimal 数据类型是一致的, 两者的精度均准确为 M 位数字。