SQL Server | 建表时使用小数类型

本文探讨了SQLServer中使用float类型存储小数时遇到的问题,解析了decimal和float数据类型的差异,并给出了正确的字段定义建议。

知识背景

在使用的时候发现一个问题,由于编程的习惯,当数据库中需要存储小数的时候,就想当然的使用了float类型,可结果太让人意外了。

数据库中存储了0.5没问题,当使用0.6的时候,得到的确是0.59999999999999998,使用1.6得到的是
1.6000000000000001,0.3得到的是0.29999999999999999,很奇怪啊!

在查找之后才明白原因,在SQL Server的帮助中这样描述:

小数数据 Decimal 数据包含存储在最小有效数上的数据。在 SQL Server中,小数数据使用 decimal 或 numeric 数据类型存储。存储 decimal 或 numeric
数值所需的字节数取决于该数据的数字总数和小数点右边的小数位数。例如,存储数值 19283.29383 比存储 1.1 需要更多的字节。

在 SQL Server中,numeric 数据类型等价于 decimal 数据类型。

近似数字数据 近似数字(浮点)数据包括按二进制计数系统所能提供的最大精度保留的数据。在 SQL Server 中,近似数字数据以 float 和 real 数据类型存储。例如,分数 1/3 表示成小数形式为
0.333333(循环小数),该数字不能以近似小数数据精确表示。因此,从 SQL Server 获取的值可能并不准确代表存储在列中的原始数据。又如,以 .3, .6, .7 结尾的浮点数均为数字近似值。

下图是各数据类型表示同一个小数的测试结果:
在这里插入图片描述

应用

建表时需要小数字段

CREATE TABLE CNT_YS_INDEX
(
   YS_INDEX					NUMERIC(10,2)	DEFAULT 0			NOT NULL,
)

NUMERIC 也可以不指定位数和精度。

### SQL Server的变量类型使用指南 在SQL Server中定义,选择合适的变量类型对于确保数据的一致性和优化性能至关重要。以下是关于如何在创的过程中指定不同类型的字段的一些指导: #### 基础数据类型 - **整数类型**: `INT`, `BIGINT`用于示大范围内的整数值;`SMALLINT`和`TINYINT`则适合较小的数据集[^1]。 - **浮点数/实数类型**: 当涉及到带有小数的数字可以选择`FLOAT(n)`或`REAL`. 如果精度非常重要,则应考虑采用`DECIMAL(p,s)` 或者 `NUMERIC(p,s)`来代替。 - **字符字符串类型**: 存储固定长度文本可以选用`CHAR(n)`而变长文本串应该用`VARCHAR(n)`. 若要保存Unicode编码的信息,请分别改用`NCHAR(n)` 和 `NVARCHAR(n)`. - **日期间戳记类型**: 达具体刻可借助于`DATETIME`,`DATE`仅记录日历上的某一天而不含小分钟秒等细节; 若需更精确的达还可以尝试`TIME`. - **二进制对象类型**: 如需处理图像、音频或其他多媒体资料,应当运用`BINARY(n)`或是其变体`VARBINARY(max)`形式存储这些非结构化的大容量文件流。 ```sql CREATE TABLE ExampleTable ( Id INT PRIMARY KEY IDENTITY(1,1), Name NVARCHAR(50) NOT NULL, BirthDate DATE, Salary DECIMAL(9,2), Photo VARBINARY(MAX) ); ``` 此段代码展示了怎样构一张包含多种属性的新,并指定了每种属性对应恰当的数据类型以及必要的约束条件. #### 特殊情况下的转换函数应用实例 当遇到需要将一种特定格式的数据作为查询条件的一部分参与索引立的情况,可以通过内置的转换功能来达成目的。例如下面的例子就演示了如何把一个整形常量转变为与目标列相匹配的varbinary类型以便正确地应用于过滤规则之中: ```sql CREATE INDEX TestTabIndex ON dbo.TestTable(a,b) WHERE b = CONVERT(VARBINARY(4), 1); GO ``` 上述命令片段明,在某些特殊场景下合理利用CONVERT()这样的标准SQL函数可以帮助我们更好地控制数据间的比较逻辑并提高检索效率.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值