莫文蔚再次白晶晶:SQL SERVER 数值类型的存储格式及转换 - misterliwei的专栏 - CS...

来源:百度文库 编辑:九乡新闻网 时间:2024/04/30 00:32:51
/*channel style*/.chal {font-family:Verdana,Helvetica,Arial,sans-serif;font-size:12px;font-weight:normal;}.chal .conts span.adv{font-weight:bold; width:300px; height:auto; float:right; text-align:righ; padding:5px 10px 1px 0; line-height:18px; text-align:right; font-weight:bold}.chal .conts span.adv img{width:300px; height:60px; padding:3px 0 0 0;}.chal .conts {clear: both; overflow: hidden; width: auto; border:1px solid #ccc; padding:0; text-align:left;}.chal .conts #ann #annbody{clear:both;overflow:hidden;width: auto;border-top:1px dashed #AACBEE;margin-bottom:5px;height:18px;padding:0;text-align:left;}.chal .conts #ann #annbodylis{width:auto; margin:0 10px 0 10px; padding:0; list-style:none;}.chal .conts #ann #annbodylis li{width:100%; float:left; line-height:150%; text-align:left; padding:0; margin:0; color:#004797;}.chal .conts #ann #annbodylis li a{color:#f00;}.chal .conts #ann #annbodylis li.cen{text-align:center;}.chal .conts #ann #annbodylis li.rig{text-align:right;}.default_contents h4.notice {background:url("http://c.csdn.net/bbs/f/i/l/pic04.gif") no-repeat scroll 4px 10px #FFFFDD;}/*end *//*20100712 jinweiwei update*/.commentnew dl dd.recruit{width:200px;float: left; text-align: left; margin-left: 15px; display:inline; border:1px solid #C1AE9E; padding:1px;}.commentnew dl dd.recruit h5{background:#E0DBD3; color:#47381C; font-size:12px; height:24px; line-height:24px; padding-left:10px;}.commentnew dl dd.recruit ul{padding:0; margin:10px 5px; height:252px; overflow:hidden; width:auto; float:none;}.commentnew dl dd.recruit ul li{list-style:none; background:url(http://c.csdn.net/www/images/blog/dot_2.gif) left 7px no-repeat; margin-left:5px; padding-left:12px; margin-bottom:6px; height:36px; overflow:hidden;}.commentnew dl dd ul{width:474px; float:left; margin:0; padding:0 0 10px 0;}.commentnew dl dd ul li.left{width:70px; margin:0 0 0 12px; display:inline; padding:0; float:left;text-align:left; line-height:18px; }*+html .commentnew dl dd ul li.left{line-height:20px;}*html .commentnew dl dd ul li.left{line-height:20px;}.commentnew dl dd ul li.lefttop{width:70px; margin:0 0 0 12px; display:inline; float:left;padding:5px 0; }.commentnew dl dd ul li.right{width:380px; margin:0; padding:0 12px 0 0; display:inline; float:left; text-align:left; line-height:18px;}.commentnew dl dd ul li.right img.brow{float:left; padding:0px 4px;}.commentnew dl dd ul li.right .textarea{width:378px; float:left; height:150px; border:1px solid #c3c3c3; padding:3px; margin:0; vertical-align:top;}.commentnew dl dd ul li.right .input{width:120px; float:left; height:18px;line-height:18px; border:1px solid #c3c3c3; padding:0 2px; margin:0; vertical-align:middle;}.commentnew dl dd ul li.right span.left{width:auto;float:left; text-align:left;}.commentnew dl dd ul li.right span.right{width:100px;float:right; text-align:right;}.commentnew dl dd ul li.right span a{color:#f00}.commentnew dl dd ul li.right span a.red:link, a.red:visited, a.red:hover, a.red:active{color:#f00}.commentnew dl dd ul li.right em{color:#466bbb;font-style:noraml;}.commentnew dl dd ul li.right a img.btn{padding:0 0 3px 0; width:68px; height:21px;}.commentnew dl dd ul li.right .checkbox{padding:0; margin:0;vertical-align:middle; border:0;}

  SQL SERVER 数值类型的存储格式及转换 收藏

SQL SERVER 数值类型的存储格式及转换



一.    整数
整数类型有四种:BigInt、Int、SmallInt和Tinyint,分别占用空间为8、4、2、1个字节。整数类型的存储格式比较简单:数据的补码形式。这个大家比较熟悉。

二.    Decimal/Numeric
这两个数据类型定义格式:decimal[(p[, s])] 和 numeric[(p[, s])]
p(精度)
指定小数点左边和右边可以存储的十进制数字的最大个数。精度必须是从 1 到最大精度之间的值。最大精度为38。
s(小数位数)
指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从 0 到 p 之间的值。默认小数位数是 0,因而 0 <= s <= p。最大存储大小基于精度而变化。
精度与存储字节之间的关系:


那么SQL SERVER是如何存储Decimal/Numeric数据的呢?

首先右移小数点s位(不管小数点后面是否为0),使得数据成为整数(这是该类型数据成为精确类型的基础)。SQL SERVER对结果值专门使用一个字节记录正负:0x00表示负;0x01表示正。结果的绝对值(没有符号部分)存储于符号值其后。
以上部分(符号位和结果值)构成了Decimal/Numeric类型数据的长度,也就是上表中占用的字节数。其实在SQL SERVER内部,另外还得需要3个字节:1个字节记录精度;1个字节记录小数位数;另有1字节为0。

所有最终的存储格式如下:

三.    Money和 Smallmoney
货币类型有两种:Money和SmallMoney,分别占用8个和4个字节。货币类型固定有4位的小数位。
货币类型和Decimal/Numeric类型的存储格式有相似处也有不同处。
相似的地方是:SQL SERVER会将货币类型小数点右移4位(相当于乘以10000),这样就成整数了。
不同的地方是,由于货币类型的小数位数固定为4,所有没有必要记录精度值和小数位数了。同时货币类型也没有专门的符号位,SQL SERVER直接将小数点右移后的值按补码存储。

给货币类型赋值时,不需要用单引号 (') 引起来。请务必记住虽然您可以指定前面带有货币符号的货币值,但 SQL Server 不存储任何与符号关联的货币信息,它只存储数值。


四.    浮点数Float和real
Float类型定义格式:float [ ( n ) ]。 n 为用于存储科学记数法 float 数尾数的位数,同时指示其精度和存储大小。n 必须为从 1 到 53 之间的值。
   精度与存储字节之间的关系:

在 SQL Server 中,real 的同义词为 float(24)。
由于浮点数存储的数据的近似值,所以如果不是要保存特别大的数据,建议使用精确类型值。浮点数的存储格式请看博文 。

五.    使用CONVERT将数值类型转换为字符型
1.    下表显示了从 float 或 real 转换为字符数据时的 style 值。

2.    在下表中,左列表示从 money 或 smallmoney 转换为字符数据时的 style 值。

3.    若目的字符串太短,则会产生下面的错误:




六.    参考文献

1.    MSDN

发表于 @ 2010年04月12日 17:40:00 | 评论( 1) | 编辑| 举报| 收藏

旧一篇:浮点数在计算机中的表示 | 新一篇:保护模式、实地址模式及V8086模式下的指令格式(上)