MySQL数据库float和decimal比较分析

float,double容易产生误差,对精确度要求比较高时,建议使用decimal来存,decimal在mysql内存是以字符串存储的,用于定义货币要求精确度高的数据。

[例子]

新建一个tab表(定义两个字段分别为float与decimal)

 代码如下 复制代码

create table tab(col_f float(10,2), col_d decimal(10,2));
插入两行记录,做为实验
insert into tab values(1234567.21, 1234567.21),(9876543.21, 9876543.12);

在数据迁移中,float(M,D)是非标准定义,最好不要这样使用。M为精度,D为标度。

 代码如下 复制代码

mysql> create table t1(c1 float(10,2), c3 decimal(10,2));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t1 values(1234567.23, 1234567.23);
Query OK, 1 row affected (0.01 sec)

mysql> select * from t1;
+------------+------------+
| c1 | c3 |
+------------+------------+
| 1234567.25 | 1234567.23 |
+------------+------------+
1 row in set (0.02 sec)

mysql> insert into t1 values(9876543.21, 9876543.12);
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> select * from t1;
+------------+------------+
| c1 | c3 |
+------------+------------+
| 1234567.25 | 1234567.23 |
| 9876543.00 | 9876543.12 |
+------------+------------+
2 rows in set (0.00 sec)

不定义fload, double的精度和标度时,存储按给出的数值存储,这于OS和当前的硬件有关。

decimal默认为decimal(10,0)

因为误差问题,在程序中,少用浮点数做=比较,可以做range比较。如果数值比较,最好使用decimal类型。

精度中,符号不算在内:

 代码如下 复制代码

mysql> insert into t1 values(-98765430.21, -98765430.12);
Query OK, 1 row affected (0.01 sec)

mysql> select * from t1;
+--------------+--------------+
| c1 | c3 |
+--------------+--------------+
| 1234567.25 | 1234567.23 |
| 9876543.00 | 9876543.12 |
| -98765432.00 | -98765430.12 |
+--------------+--------------+
3 rows in set (0.00 sec)

float占4个字节,double占8个字节,decimail(M,D)占M+2个字节。

decimal 类型可以精确地表示非常大或非常精确的小数。大至 1028(正或负)以及有效位数多达 28 位的数字可以作为 decimal类型存储而不失其精确性。该类型对于必须避免舍入错误的应用程序(如记账)很有用。

float是浮点数,不能指定小数位。
decimal是精确数,可以指定精度。
对mysql 5来说 decimal(p,s)中p最大为65,S最大为30
decimal数据类型最多可存储 38 个数字,它存储了一个准确(精确)的数字表达法,不存储值的近似值。

当数据值一定要按照指定精确存储时,可以用带有小数的decimal数据类型来存储数字。
float和real数据类型被称为近似的数据类型。不存储精确值.当要求精确的数字状态时,比如在财务应用程序中,在那些需要舍入的操作中,或在等值核对的操作中,就不使用这些数据类型。这时就要用integer、decimal、money或smallmone数据类型。

在 WHERE 子句搜索条件中(特别是 = 和 <> 运算符),应避免使用float或real列。最好限制使用float和real列做> 或 < 的比较。

float 使用的数据类型就是C语言里面的float, decimal使用的是mysql定义的decimal_t, 这个源文件decimal.c我看过,  结构体时这么定义的:

 代码如下 复制代码

/**
    intg is the number of *decimal* digits (NOT number of decimal_digit_t's !)
         before the point
    frac is the number of decimal digits after the point
    len  is the length of buf (length of allocated space) in decimal_digit_t's,
         not in bytes
    sign false means positive, true means negative
    buf  is an array of decimal_digit_t's
 */
typedef struct st_decimal_t {
  int    intg, frac, len;
  my_bool sign;
  decimal_digit_t buf[9];
} decimal_t;

所以表示的数的精度和范围就知道了

时间: 2024-10-12 19:21:21

MySQL数据库float和decimal比较分析的相关文章

mysql数据库中索引的利弊分析

索引,可以说是数据库相关优化尤其是在Query 优化中最常用的优化手段之一了,虽然如此,但索引也并非是解决query优化的圣经,不能只要发现Query 运行不够快就将where子句中的条件全部放在索引中.什么事都是适而可止,过犹不及,一起来看过究竟吧. 索引的利处 索引能够提高数据检索的效率,降低数据库的IO 成本和排序成本.在数据库中个表的某个字段创建索引,所带来的最大益处就是将该字段作为检索条件的时候 可以极大的提高检索效率,加快检索时间,降低检索过程中所需要读取的数据量. 索引不是多多益善

mysql数据库分表性能优化分析

我们的项目中有好多不等于的情况.今天写这篇文章简单的分析一下怎么个优化法. 这里的分表逻辑是根据t_group表的user_name组的个数来分的. 因为这种情况单独user_name字段上的索引就属于烂索引.起不了啥名明显的效果. 1.试验PROCEDURE.  代码如下 复制代码 DELIMITER $$ DROP PROCEDURE `t_girl`.`sp_split_table`$$ CREATE  PROCEDURE `t_girl`.`sp_split_table`() BEGIN

基于MySQL数据库复制Master-Slave架构的分析_Mysql

为了应用系统的可伸缩性,往往需要对数据库进行scale out设计,scale out设计也就是通过增加数据库处理节点来提高系统整体的处理能力,即增加数据库服务器的数量来分担压力.通过这种方式系统的伸缩性增强了,成本也降低了,但是系统的架构复杂了,维护困难了.难免出现系统的宕机或故障.因此,理论上来说,系统的安全性(可能数据丢失)降低了,可用性也降低了.那么要提高数据安全性,以及系统的高可用性,很简单的办法就是所有软硬件都避免单点隐患,所有数据都保存多份.从技术上来说,就可以通过数据库复制技术实

mysql数据库UPDATE语句一个bug分析

这个我认为的bug,反馈给MySQL官方,但是MySQL官方认为这并不是一个bug,并给出了解释,我认为这个解释是合理的,但是不可避免的是这条语句实在太危险了. 问题描述 示例表结构与表数据: # 表结构 mysql> show create table t; +-------+--------------------------------------------------------------------------------------------------------------

MySQL数据库服务器逐渐变慢分析与解决方法分享_Mysql

一.检查系统的状态 通过操作系统的一些工具检查系统的状态,比如CPU.内存.交换.磁盘的利用率,根据经验或与系统正常时的状态相比对,有时系统表面上看起来看空闲,这也可能不是一个正常的状态,因为cpu可能正等待IO的完成.除此之外,还应观注那些占用系统资源(cpu.内存)的进程. 1.使用sar来检查操作系统是否存在IO问题 #sar-u210- 即每隔2秒检察一次,共执行20次. 结果示例: 注:在redhat下,%system就是所谓的%wio. Linux2.4.21-20.ELsmp (Y

mssql修改数据库Float到decimal类型无法修改表

错误提示 "MBom"表 - 无法修改表. The query has been canceled because the estimated cost of this query (598) exceeds the configured threshold of 300. Contact the system administrator. 解决办法 在修改后的Designer上右键,选这个,把内容考出来,新建一个查询 在最上面加这么一句  代码如下 复制代码 SET QUERY_GO

MySQL数字类型int与tinyint、float与decimal如何选择

最近在准备给开发做一个mysql数据库开发规范方面培训,一步一步来,结合在生产环境发现的数据库方面的问题,从几个常用的数据类型说起. int.tinyint与bigint 它们都是(精确)整型数据类型,但是占用字节数和表达的范围不同.首先没有这个表就说不过去了: Type Storage Minimum Value Maximum Value (Bytes) (Signed/Unsigned) (Signed/Unsigned) TINYINT 1 -128 127 0 255 SMALLINT

如何用SQLyog来分析MySQL数据库

用SQLyog来分析MySQL数据库: SOLyog的下载.安装以及使用很简单.我去了相关网站下载,它只有384K字节大小.它把两个文件(一个可执行文件.exe和一个动态链接库文件.dll)安装到C:\Program Files\SQLyog路径下.然后运行可执行文件. 安装后没有必要再访问该网站了,我访问该网站是得到了一个消息,说它的域名没有设置(configured).登记.或正在建设中.我不清楚这个问题是暂时的还是一直是这样.该软件是免费的,并且没有标志广告(banner ads),所以它

五种MySQL数据库可靠性方案的分析和比较

这篇文章主要从基本情况.成本.优缺点和应用场合等方面对5种MySQL的可靠性方案进行了详细的分析和比较,另外,本文对MySQL数据库的开发和管理有一定的借鉴作用.详细内容请大家参考下文: 1.MySQL Clustering(ndb-cluster stogare) 简介: MySQL公司以存储引擎方式提供的高可靠性方案,是事务安全的,实时复制数据,可用于需要高可靠性及负载均衡的场合.该方案至少需要三个节点服务器才能达到较好的效果. 成本: 节点服务器对RAM的需求很大,与数据库大小呈线性比例: