SQL 服务器 - float 与 varchar
SQL Server - float vs varchar
在 SQL 服务器中,我将十进制数据存储在 table 中(从不用于连接或过滤)。此十进制数据是可变的 - 80% 的时间它具有单个数字值(1、4、5),其余 20% 具有 16 位小数(0.8999999761581421、3.0999999046325684)。
我想知道是否可以使用 varchar
而不是 float
来节省任何存储空间 space,或者我是否应该坚持使用 float
因为这是数字数据?
总是使用最合适的数据类型!由于这显然是 numerical 数据 - 使用数字类型。这将允许例如对值求和,按这些值排序 - 这些是数字 - 所以请按原样处理和存储它们!
如果您需要支持分数,您可以可以使用FLOAT
或REAL
,但它们因舍入错误等而臭名昭著。使用DECIMAL(p,s)
避免了这些陷阱 - 它稳定,精确,不易出现舍入错误。所以这将是我合乎逻辑的选择。
有关如何定义 p
(精度 - 总体位数)和 s
(比例 - 位数 小数点后).
顺便说一句:那些存储在 更少 字节中的 varchar
列足以容纳这些值!
这是一个有趣的观察结果:
从数学值开始0.9
将其转换为二进制数。同理1/3不能用10进制的有限位数表示,0.9这个数也不能用2进制的有限位数表示。精确的数学值为:
0.1 1100 1100 1100 1100 1100 1100 1100
...“1100”永远重复。
让我们将此值存储在 IEEE-754 single-precision floating-point 值中。 (在 SQL 服务器中,这称为 REAL
类型)。为此,我们必须四舍五入到 23 位有效位。结果是:
0.1 1100 1100 1100 1100 1100 11
将其转换为精确的十进制等效值,您将得到:
0.89999997615814208984375
四舍五入到小数点后16位。你得到:
0.8999999761581421
这恰好是您作为示例显示的值。
如果你对 3.1
做同样的事情,你会得到 3.0999999046325684
有没有可能你所有的输入都是小数点后一位数字,存储为floating-point值,然后转换回小数?
在 SQL 服务器中,我将十进制数据存储在 table 中(从不用于连接或过滤)。此十进制数据是可变的 - 80% 的时间它具有单个数字值(1、4、5),其余 20% 具有 16 位小数(0.8999999761581421、3.0999999046325684)。
我想知道是否可以使用 varchar
而不是 float
来节省任何存储空间 space,或者我是否应该坚持使用 float
因为这是数字数据?
总是使用最合适的数据类型!由于这显然是 numerical 数据 - 使用数字类型。这将允许例如对值求和,按这些值排序 - 这些是数字 - 所以请按原样处理和存储它们!
如果您需要支持分数,您可以可以使用FLOAT
或REAL
,但它们因舍入错误等而臭名昭著。使用DECIMAL(p,s)
避免了这些陷阱 - 它稳定,精确,不易出现舍入错误。所以这将是我合乎逻辑的选择。
有关如何定义 p
(精度 - 总体位数)和 s
(比例 - 位数 小数点后).
顺便说一句:那些存储在 更少 字节中的 varchar
列足以容纳这些值!
这是一个有趣的观察结果:
从数学值开始0.9
将其转换为二进制数。同理1/3不能用10进制的有限位数表示,0.9这个数也不能用2进制的有限位数表示。精确的数学值为:
0.1 1100 1100 1100 1100 1100 1100 1100
...“1100”永远重复。
让我们将此值存储在 IEEE-754 single-precision floating-point 值中。 (在 SQL 服务器中,这称为 REAL
类型)。为此,我们必须四舍五入到 23 位有效位。结果是:
0.1 1100 1100 1100 1100 1100 11
将其转换为精确的十进制等效值,您将得到:
0.89999997615814208984375
四舍五入到小数点后16位。你得到:
0.8999999761581421
这恰好是您作为示例显示的值。
如果你对 3.1
做同样的事情,你会得到 3.0999999046325684
有没有可能你所有的输入都是小数点后一位数字,存储为floating-point值,然后转换回小数?