SQL Server 2008连载之数据类型

精确数字类型

decimal[ (p[ , s] )] numeric[ (p[ , s] )] 也称为带固定精度和小数位数的数值数据类型。

固定精度和小数位数。使用最大精度时,有效值从 - 10^38 +1 10^38 - 1

p (精度)最多可以存储的十进制数字的总位数,包括小数点左边和右边的位数。该精度必须是从 1 到最大精度 38 之间的值。默认精度为 18

s (小数位数)小数点右边可以存储的十进制数字的最大位数。小数位数必须是从 0 p 之间的值。仅在指定精度后才可以指定小数位数。默认的小数位数为 0 ;因此, 0 <= s <= p 。最大存储大小基于精度而变化。

 

近似数字

float [ ( n ) ]

其中 n 为用于存储 float 数值尾数的位数(以科学记数法表示),因此可以确定精度和存储大小。如果指定了 n ,则它必须是介于 1 53 之间的某个值。 n 的默认值为 53

 

日期和时间

字符串

其他数据类型

 

下面我们创建一张囊括几乎所有数据类型的表,然后根据

CREATE TABLE testDataType

(

  "bit"                 bit ,

  "tinyint"             tinyint ,

  "smallint"            smallint ,    

  "int"                 int ,    

  "bigint"              bigint ,      

  "decimal(p,s)"        decimal ( 10 , 4),

  "numeric(p,s)"        numeric ( 10 , 6),

  "smallmoney"          smallmoney ,  

  "money"               money ,       

  "float"               float ,

  "real"                real ,

  "datetime"            datetime ,      

  "date"                 date ,          

  "time"                time ,          

  "smalldatetime"       smalldatetime ,

  "datetime2"           datetime2 ,     

  "datetimeoffset"      datetimeoffset ,

  "char(n)"             char ( 4),       

  "varchar(n)"          varchar ( 4),    

  "nchar(n)"            nchar ( 4),      

  "nvarchar(n)"         nvarchar ( 4),   

  "binary(n)"           binary ( 6),     

  "varbinary(n)"        varbinary ( 6),  

  "varchar(max)"        varchar ( max ),  

  "nvarchar(max)"       nvarchar ( max ),

  "varbinary(max)"      varbinary ( max ),

  "Text"                Text ,          

  "Ntext"               Ntext ,         

  "Image"               Image         

)

-- 向各个字段插入相应的数据值

INSERT INTO testDataType (

  "bit" , "tinyint" , "smallint" , "int" , "bigint" ,

  "decimal(p,s)" , "numeric(p,s)" ,

  "smallmoney" , "money" ,

  "float" , "real" ,

  "datetime" , "date" , "time" ,

  "smalldatetime" , "datetime2" , "datetimeoffset" ,

  "char(n)" , "varchar(n)" , "nchar(n)" , "nvarchar(n)" ,

  "binary(n)" , "varbinary(n)" ,

  "varchar(max)" , "nvarchar(max)" , "varbinary(max)" ,

  "Text" , "Ntext" , "Image"

)

SELECT

  1, 123, 12345, 1234567890, 1234567890123456789,

  987654.3210, 9876.543210,

  123456.7890, 123456789012345.6789,

  1234567890.1234567890, 1234567890.1234567890,

  '2010-01-01 23:59:59.123' , '2010-01-01' , '23:59:59. 1234567' ,

  '2010-01-01 23:59:59' , '2010-01-01 23:59:59.1234567' , '2010-01-01 23:59:59.1234567 +12:00' ,

  'abcd' , 'abcd' , ' 王保强 ' , ' 王保强 ' ,

  CONVERT ( BINARY , '123456' ), CONVERT ( BINARY , '123456' ),

  '1234567890' , '1234567890' , CONVERT ( BINARY , '1234567890' ),

  '1234567890' , '1234567890' , '1234567890'

-- 使用 system_internals_allocation_units 来获取该表的相关数据页

SELECT c . name , a . type_desc ,

       total_pages , used_pages , data_pages ,

       testdb . dbo . f_get_page ( first_page ) first_page_address ,

       testdb . dbo . f_get_page ( root_page ) root_address ,

       testdb . dbo . f_get_page ( first_iam_page ) IAM_address

  FROM sys . system_internals_allocation_units a , sys . partitions b , sys . objects c

  WHERE a . container_id = b . partition_id and b . object_id = c . object_id

   AND c . name in ( 'testDataType' )    

-- 再使用dbcc page 命令分析相关页面信息

 

相关字段数据及其数据存储信息和存储字节说明

对于 bit tinyint smallint int bigint 这类整型数据,应该是比较容易理解的,例如十进制数 1234567890 ,换算成 16 进制为 499602D2 ,在 SQL Server 中,数字的存储是需要倒置的,因此实际存储应为 D2029649

对于 decimal(p,s) numeric(p,s) 的值分别为 987654.3210 9876.543210 ,但二进制却均为 01EA16B04C02000000 ,把 9876543210 换算成 16 进制为 24CB016EA 进行翻转,然后再加上符号位,即为 01EA16B04C02000000 ;但很奇怪两者没有存储小数位置,难道需要临时从数据字典中获取?

smallmoney 用四个字节表示,存储的是与基数 -214748.3648 想减得到的数字再乘以 10000 后的二进制形式。 Money 用八个字节表示,存储的是与基数 -922,337,203,685,477.5808 想减得到的数字再乘以 10000 后的二进制形式。

float real 暂未知

datetime 类型的第一个 4 字节存储的是 base date (即 1900 1 1 日)之前或之后的天数;另外一个 4 字节存储以午夜后毫秒数所代表的每天的时间。

smalldatetime 数据类型存储日期和每天的时间,但精确度低于 datetime 。第一个 2 字节存储 1900 1 1 日后的天数;另外一个 2 字节存储午夜后的分钟数。

date 类型的 3 个字节存储的是 base date (即 1900 1 1 日)之后的天数。

time 类型的 5 个字节存储的是以午夜后 100 纳秒所代表的每天的时间。

datetime2 类型的前 3 字节存储的是 base date (即 1900 1 1 日)之前或之后的天数;另外一个 5 字节存储以午夜后 100 纳秒数所代表的每天的时间。

关于 char varchar ,存储的是该字符的 ASCI 码;双字节字符存储 2 位。

对于 nchar nvarchar ,存储的 UNICODE UCS-2 字符集的双字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

python与大数据分析

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值