浮点数在数据库 Sql Server 中存储为 Real

Posted

技术标签:

【中文标题】浮点数在数据库 Sql Server 中存储为 Real【英文标题】:Float stored as Real in database Sql Server 【发布时间】:2017-05-28 11:23:19 【问题描述】:

为什么Floatsys.columnsInformation_schema.columns 中存储为Real precision <= 24

CREATE TABLE dummy
  (
     a FLOAT(24),
     b FLOAT(25)
  ) 

检查数据类型

SELECT TABLE_NAME,
       COLUMN_NAME,
       DATA_TYPE,
       NUMERIC_PRECISION
FROM   INFORMATION_SCHEMA.COLUMNS
WHERE  TABLE_NAME = 'dummy' 

结果:

+------------+-------------+-----------+-------------------+
| TABLE_NAME | COLUMN_NAME | DATA_TYPE | NUMERIC_PRECISION |
+------------+-------------+-----------+-------------------+
| dummy      | a           | real      |                24 |
| dummy      | b           | float     |                53 |
+------------+-------------+-----------+-------------------+

那么当precision 小于或等于24 时,为什么float 存储为real。这是否记录在某处?

【问题讨论】:

非常similar question 【参考方案1】:

来自MSDN article,它讨论了 T-SQL 中 floatreal 之间的区别:

real 的 ISO 同义词是 float(24)。

float [ (n) ]

其中 n 是用于以科学计数法存储浮点数尾数的位数,因此,它决定了精度和存储大小。如果指定了 n,则必须是 1 到 53 之间的值。n 的默认值为 53。

n value | Precision | Storage size
1-24    | 7 digits  | 4 bytes
24-53   | 15 digits | 8 bytes

SQL Server 将 n 视为两个可能值之一。 如果 1

至于为什么 SQL Server 将其标记为real,我认为它只是一个同义词。然而,在引擎盖下它仍然是float(24)

【讨论】:

@Prdp 我不认为它将它存储为real,而是float(24)。将其标记real 正在比较两个相似数据库之间的数据类型。这个Real 让我发疯了,因为我们不使用Real 创建数据类型:D。后来我意识到Float 存储为Real【参考方案2】:

real 的 ISO 同义词是 float(24)。
Please refer for more info:
https://msdn.microsoft.com/en-us/library/ms173773.aspx

【讨论】:

没关系,但为什么它存储为Real 而不是Float(24) 嗨,Pradeep,我认为它只是一个同义词。文档清楚地表明,在引擎盖下它仍然只是一个float(24)

以上是关于浮点数在数据库 Sql Server 中存储为 Real的主要内容,如果未能解决你的问题,请参考以下文章

将浮点数转换为 varchar sql

RODBC 将浮点数作为 SQL Server 中的字符

为啥 SQL 浮点数与 C# 浮点数不同

深入浮点数

浮点数存储方式

如何在R中转换浮点数