现在的位置: 首页 > 综合 > 正文

SQL Server 2008连载之数据类型

2013年10月11日 ⁄ 综合 ⁄ 共 3546字 ⁄ 字号 评论关闭

精确数字类型

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
字符集的双字

【上篇】
【下篇】

抱歉!评论已关闭.