mysql数据类型double和decimal区别详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt336
实数是带有小数部分的数字。然而,它们不只是为了存储小数部分,也可以使用
DEClMAL 存储比 BIGINT还大的整数。 MySQL 既支持精确类型,也支持不精确类型。
FLOAT 和 DOUBLE 类型支持使用标准的浑点运算进行近似计算。如果需要知道浮点运算是
怎么计算的,则需要研究所使用的平台的浮点数的具体实现。
DECIMAL 类型用于存储精确的小数。在 MySQL 5.0 和更高版本, DECIMAL 类型支持精确 计算。 MySQL 4.1 以及更早版本则使用浮点运算来实现 DECIAML 的计算,这样做会因为 精度损失导致一些奇怪的结果。在这些版本的 MySQL 中,DEClMAL 只是一个"存储类型"。
因为 CPU 不支持对 DEClMAL 的直接计算,所以在 MySQL 5.0 以及更高版本中, MySQL 服务器自身实现了 DECIMAL 的高精度计算。相对而言, CPU 直接支持原生浮点计算,所 以浮点运算明显更快。
浮点和 DECIMAL 类型都可以指定精度。对于 DECIMAL 列,可以指定小数点前后所允许的 最大位数。这会影响列的空间消耗。 MySQL 5.0 和更高版本将数字打包保存到一个二进 制字符串中(每 4个字节存 9个数字)。例如, DEClMAL(18 ,9)小数点两边将各存储 9个 数字,一共使用 9 个字节:小数点前的数字用 4 个字节,小数点后的数字用 4 个字节, 小数点本身占 1个字节。
MySQL 5.0 和更高版本中的 DEClMAL 类型允许最多 65个数字。而早期的 MySQL 版本中 这个限制是254个数字,并且保存为未压缩的字符串(每个数字一个字节)。然而,这些(早 期)版本实际上并不能在计算中使用这么大的数字,因为 DECIMAL 只是一种存储格式: 在计算中 DEClMAL 会转换为 DOUBLE 类型。
有多种方法可以指定浮点列所需要的精度,这会使得 MySQL 悄悄选择不同的数据类型, 或者在存储时对值进行取舍。这些精度定义是非标准的,所以我们建议只指定数据类型, 不指定精度。
浮点类型在存储同样范围的值时,通常比 DECIMAL 使用更少的空间。 FLOAT 使用 4个字 节存储。 DOUBLE 占用8个字节,相比 FLOAT有更高的精度和更大的范围。和整数类型一样, 能选择的只是存储类型 IMySQL 使用 DOUBLE 作为内部浮点计算的类型。
因为需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时才使用
DECIMAL一一例如存储财务数据。但在数据量比较大的时候,可以考虑使用 BIGINT 代替
DECIMAL,将需要存储的货币单位根据小数的位数乘以相应的倍数即可。假设要存储财
务数据精确到万分之一分,则可以把所有金额乘以一百万,然后将结果存储在 BIGI町里,
这样可以同时避免浮点存储计算不精确和 DECIMAL 精确计算代价高的问题。
mysql数据类型double和decimal区别详解的更多相关文章
- JavaScript 基本数据类型和引用类型的区别详解
js基本数据类型: js基本数据类型包括:undefined,null,number,boolean,string.基本数据类型是按值访问的,就是说我们可以操作保存在变量中的实际的值 1. 基本数据类 ...
- js基本数据类型和引用类型的区别详解-笔记
原文参考http://mp.weixin.qq.com/s/apFyUgqT5N-bsDUjP4Eryg 笔记总结 首先记住js中的基础数据类型undefined,null,boolean,strin ...
- MySQL单列索引和组合索引(联合索引)的区别详解
发现index merge局限性,优化器会自动判断是否使用 index merge 优化技术,查询还是需要组合索引[推荐阅读:对mysql使用索引的误解] MySQL单列索引和组合索引(联合索引)的区 ...
- 【转】MySQL用户管理及SQL语句详解
[转]MySQL用户管理及SQL语句详解 1.1 MySQL用户管理 1.1.1 用户的定义 用户名+主机域 mysql> select user,host,password from mysq ...
- MySQL数据库的各种存储引擎详解
原文来自:MySQL数据库的各种存储引擎详解 MySQL有多种存储引擎,每种存储引擎有各自的优缺点,大家可以择优选择使用: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB ...
- HTTP POST GET 本质区别详解
HTTP POST GET 本质区别详解 一 原理区别 一般在浏览器中输入网址访问资源都是通过GET方式:在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交 Ht ...
- javascript中=、==、===区别详解
javascript中=.==.===区别详解今天在项目开发过中发现在一个小问题.在判断n==""结果当n=0时 n==""结果也返回了true.虽然是个小问题 ...
- Bind和Eval的区别详解
原文:Bind和Eval的区别详解 1.简单描述Eval和Bind的区别 绑定表达式 <%# Eval("字段名") %> <%# Bind("字段名& ...
- MySql绿色版配置及使用详解
原文:MySql绿色版配置及使用详解 最近在做项目开发时用到了MySql数据库,在看了一些有关MySql的文章后,很快就上手使用了.在使用的过程中还是出现了一些问题,因为使用的是绿色免安装版的MySq ...
随机推荐
- iOS字典转模型MJExtension使用
如果项目是纯OC的建议使用,MJExtension是一套字典和模型之间互相转换的超轻量级框架,可以轻松完成: 字典(JSON) --> 模型(Model) 模型(Model) --> 字典 ...
- mybatis入门介绍一
首先介绍一下Mybatis是什么?mybatis是Java的持久层框架, JAVA操作数据库是通过jdbc来操作的,而mybatis是对jdbc的封装. 使用mybatis之后,开发者只需要关注sql ...
- C语言开发面试题
(以下是题主参加的一家偏向Linux平台开发的公司软件岗位笔试题,分享原题,后面附上题主91分的部分参考答案^V^) 一.(8分)请问一下程序输出什么结果? char *getStr(void) { ...
- 设置双击直接打开.ipynb文件
本文环境:win10(64)+anaconda3(64) anaconda3安装好后,可在开始菜单下查看 背景:jupyter notebook打开后无法更改路径,只能在默认路径下upload文件(如 ...
- python--DenyHttp项目(1)--socket编程:服务器端进阶版socketServer
在网上看到了SocketServer模块,于是Server端简化: #coding:utf-8 import socketserver class MyTCPHandler(socketserver. ...
- CentOS Linux 新建oracle数据库实例并连接
CentOS Linux 新建oracle数据库实例 安装好oracle之后,首先想到的那就是自己建一个库来看看效果喽. 创建的过程如下文章所说,http://blog.chinaunix.net/u ...
- java正则表达式提取地址中的ip和端口号
由于我需要用到java正则表达式提取地址中的ip和端口号,所以我就写了一个demo,测试一下,下面是demo public class Test0810_1 { public static void ...
- 在linux环境下安装Node
liunx安装node的方法 cd /usr/src //node 安装的位置 一 : 普通用户: 安装前准备环境: 1.检查Linux 版本 命令: cat /etc/redhat-releas ...
- Linux操作系统-安装JAVA
首先准备好jdk文件(例如:本地已下载了jdk-6u33-linux-x64.bin),将它上传到路径 “/home/username/” 这个目录的下面 其次按步骤执行: 1.进入到 “/home/ ...
- 删除oracle数据库[转]
--===================== -- 手动删除oracle数据库 --===================== 在很多情况下,或无法使用dbca工具的时候,我们需要手动来删除数据库. ...