1.3 SQL Server数据类型
熟悉了SQL Serve数据库的基本对象后,现在来看看所有处理数据的环境中一个核心的选项:数据类型。注意,既然本书是为开发者而著,并且没有哪个开发者会不了解数据类型,因此,我将假设你已知晓数据类型的工作原理,这里只需要了解SQL Server数据类型的细节。
SQL Server 2005中的数据类型如下表所示。
|
数据类型名称 |
类 别 |
大小(字节) |
数据的本质 |
|
Bit |
Integer |
1 |
数据的大小容易让人误解。表中第一个bit数据类型取用一个字节,接下来的7个bit数据类型使用同一个字节。允许null则会多使用一个字节 |
|
Bigint |
Integer |
8 |
当需要频繁使用越来越大的数值时,可以使用Bigint数据类型。该数据类型允许使用-263~263-1内的数值,即正负460百万兆 |
|
Int |
Integer |
4 |
-2 147 483 648~2 147 483 647的全部数值 |
|
SmallInt |
Integer |
2 |
-32 768~32 767的全部数值 |
|
TinyInt |
Integer |
1 |
0~255的全部数值 |
|
Decimal或Numeric |
Decimal/ |
变化的 |
固定精度和小数位数,-1038-1~1038-1。这两个名称意思相同 |
|
Money |
Money |
8 |
-263~263,精确到所代表货币单位的万分之一。注意,货币单位可以是任意的,不限于美元 |
|
SmallMoney |
Money |
4 |
-214 748.3648~214 748.3647货币单位 |
|
Float(与ANSI的real的同义词) |
Approximate Numerics |
变化的 |
接受一个参数(如Float(20)),以确定存储大小和精度。注意,该参数是以位为单位,而不是以字节为单位。范围为-1.79E+308~1.79E+308 |
|
DateTime |
Date/Time |
8 |
表示日期和时间的数据类型,从1753年1月1日到9999年12月31日,精确度是1/300s |
|
SmallDateTime |
Date/Time |
4 |
表示日期和时间的数据类型,从1900年1月1日到2079年6月6日,精确度是1min |
|
Cursor |
Special Numeric |
1 |
指向游标的指针。虽然指针只占用一个字节,但要记住,构成实际游标的结果集也要占用内存——具体占用多少取决于结果集 |
|
Timestamp/rowversion |
Special Numeric(二进制数字) |
8 |
在给定的数据库中唯一的特殊值。当对数据库执行记录插入或更新时,由数据库自己自动地设置该值——即使没有在UPDATE语句中提及timestamp列(实际上,不允许直接更新timestamp域) |
|
Unique Identifier |
Special Numeric(二进制数字) |
16 |
特殊的全局唯一标识符(GUID)。确保跨时间和空间上是唯一的 |
|
Char |
Character |
变化的 |
固定长度字符数据。如果值的长度比设定的长度短,则将添补空格直至达到设定的长度。数据是非Unicode字符数据。可指定的最大长度是8 000字符 |
(续)
|
数据类型名称 |
类 别 |
大小(字节) |
数据的本质 |
|
VarChar |
Character |
变化的 |
可变长度的字符数据。不会向值中填入空格。数据是非Unicode字符数据。可指定的最大长度是8 000字符,不过,可以使用max关键字,表明该数据是非常大的字符数据(最大存储大小是231字节) |
|
Text |
Character |
变化的 |
在SQL Server 2005中是一种遗留系统支持。使用varchar (max)替代 |
|
NChar |
Unicode |
变化的 |
固定长度Unicode字符数据。如果值的长度比设定的长度短,则将添补空格直至达到设定的长度。可指定的最大长度是4 000字符 |
|
NVarChar |
Unicode |
变化的 |
可变长度Unicode字符数据。不会向值中填入空格。可指定的最大长度是4 000字符,不过,可以使用max关键字,表明该数据是非常大的字符数据(最大存储大小是231字节) |
|
Ntext |
Unicode |
变化的 |
与Text数据类型类似,在SQL Server 2005中只是一种遗留系统支持。在这里,使用nvarchar(max)。可变长度的Unicode字符数据 |
|
Binary |
Binary |
变化的 |
固定长度的二进制数据,最大长度是8KB |
|
VarBinary |
Binary |
变化的 |
可变长度的二进制数据,可指定的最大长度是8KB,不过,可以使用max关键字,表明该数据是一个大型数据对象LOB(最大存储大小是231字节) |
|
Image |
Binary |
变化的 |
在SQL Server 2005中是一种遗留系统支持。使用varbinary(max)替代 |
|
Table |
Other |
特殊的 |
主要用于处理结果集,典型的用法是,从用户定义函数中传出Table数据。不能作为表定义中的数据类型来使用。(不可以嵌套表。) |
|
Sql_ |
Other |
特殊的 |
与VB和C++中的Variant有些类似。本质上,是能够容纳大多数其他SQL Server数据类型的容器。这意味着,当一个列或函数需要能够处理多种数据类型时,可以使用Sql_variant。与VB不同,使用这种数据类型时,必须明确地将其转换为更确定的数据类型 |
|
XML |
Character |
变化的 |
用于存储XML数据的字符数据类型。用于基于XML模式验证数据,以及特殊的面向XML的函数 |
大多数数据类型在其他编程语言中都有等价的数据类型。例如,SQL Server中的int等价于Visual Basic中的Long,对于C++中大多数的系统和编译器组合来说,等价于int。
SQL Server中没有无符号数值数据类型的概念。如果要用到的数比有符号数据类型允许的值更大,则应该考虑使用取值范围更大的有符号数据类型。如果需要防止使用负数,可以用CHECK约束来加以限制,使得只有值大于或等于0的数据有效。
一般来说,SQL Server中的数据类型与大多数其他现代编程语言中的数据类型的工作方式类似。两个数相加得到和,而字符串相加则是把字符串串联起来。
当在不同数据类型的变量或字段间进行处理或赋值时,会发生许多隐式(或自动)的转换。大多数数据类型能够进行显式的转换(需明确地说明要转换为的目标数据类型)。一些数据类型相互之间完全不能进行转换。图1-2是显示了各种可能的转换的图表。
|
|
|
图 1-2
简言之,SQL Server中的数据类型与其他编程环境中的数据类型作用类似。数据类型通过确保提供的数据具有期望的数据性质(要知道,1/1/1980作为日期与作为数字,含义是不同的),来防止出现程序设计错误,并确保执行的操作类型是希望的类型。
NULL数据
设想有一行,该行在特定的列上没有任何数据——即完全不知道此处的值是多少。例如,假设有一条记录,用以存储指定年份公司的业绩信息。如果其中一个字段中存储的是比上一年增长的百分比,可是,对于数据库中第一条记录而言,没有早于这一年的记录。或许,你会试图在PercentGrowth列中输入0值。然而,这样就能提供正确的信息吗?没有深入了解的人可能会认为该值意味着公司在那一年的增长率为0。然而,事实却是不知道那一年的增长率为多少。
未确定的值即是NULL。似乎每次教授程序设计的课程时,至少会有一名学生问我如何定义NULL的值。这真是个困难的问题,因为从定义来讲,NULL值意味着不知道其值究竟是多少。它可以是1,可以是347,也可以是-294,谁知道呢。简言之,它意味着不确定,或者,也许是不可用。