-
- 数据表的基本结构
表是数据库的基本构造块,同时,表是数据的集合,是用来存储数据和操作数据的逻辑结构。表是由行和列组成的。
-
-
- 表的列名在同一个表中具有惟一性,同一列的数据属于同一种数据类型。
-
-
-
- 定义其它属性:NULL 或NOTNULL 属性和IDENTITY 属性。
-
数据表被分为永久性数据表和临时数据表两种。临时表又分为局部临时表和全局临时
表.
DBCC PAGE:查看数据结构
在计算机中数据有两种特征:类型和长度。所谓数据类型就是以数据的表现方式和存储方式来划分的数据的种类。在SQL Server 中每个变量、参数、表达式等都有数据类型。当两个具有不同数据类型的表达式通过运算符进行组合时,结果的特征遵循以下原则:
- 结果的数据类型是通过将数据类型的优先顺序规则应用到输入表达式的数据类型来
数据类型分类 |
数据类型 |
基本目的 |
精确数值 |
BIT 、INT、SMALLINT、TINYINT、BIGINT 、 DECIMAL(p,s)、NUMERIC (p,s) |
存储带或不带小数的精确数值 |
近似数值 |
FLOAT(p)、REAL |
存储带小数或不带小数的数值 |
货币 |
MONEY、SMALLMONEY |
存储带 4 位小数位的数值,专门用于 货币值, |
日期和时间 |
DATE、TIME、DATETIME、SMALLDATETIME |
存储时间和日期信息 |
字符 |
CHAR(n) 、 NCHAR(n) 、 VARCHAR(n) 、 VARCHAR(max) 、 NVARCHAR(n) 、 NVARCHAR(max) 、TEXT、NTEXT |
存储基于可变长度的字符的值 |
二进制 |
BINARY(n)、VARBINARY(n)、VARBI NARY(max)、 IMAGE |
存储二进制表示数据 |
特定数据类型 |
TIMESTAMP 、TABLE、UNIQUEIDENTIFIER、 CURSOR、SQL_VARI ANT、XML |
专门处理的复杂的数据类型 |
数据类型 |
存储长度 |
取值范围 |
说明 |
BIT |
1B |
0 或者 1 |
如果输入 0 或 1 以外的值,将被视为 1。 如果表中的列为 8 bit 或更少,则这些列作为 1 个字节存储。如果列为 9 到 16 bit,则这些列作为 2 个字节存储, 以此类推 |
INT |
4B |
-2^31 ~2^31-1 |
正负整数 |
SMALLINT |
2B |
-32768~32767 |
正负整数 |
TINYINT |
1B |
0~255 |
正整数 |
BIGINT |
8B |
-2^63 ~2^63-1 |
大范围的正负整数 |
DECIMAL(p,s) |
5~17B |
- 10^38 +1 ~ 10^38 - 1 |
最大可存储 38 位十进制数 |
NUMERIC(p,s) |
5~17B |
- 10^38 +1 ~ 10^38 - 1 |
与 DECIMAL 等价 |
数字数据只包含数字。数字数据类型包括正数和负数、小数(浮点数)和整数。 整数由正整数和负整数组成,例如 39、25、0-2 和 33967。在 Microsoft SQL Server
中,整数存储的数据类型是 Int,Smallint 和 Tinyint。Int 数据类型存储数据的范围
大于 Smallint 数据类型存储数据的范围,而 Smallint 数据类型存储数据的范围大于Tinyint 数据类型存储数据的范围。使用 Int 数据类型存储数据的范围是从 -2 147 483 648 到 2 147 483 647(每一个值要求 4 个字节存储空间)。使用 Smallint 数据类
型时,存储数据的范围从 -32 768 到 32 767(每一个值要求 2 个字节存储空间)。使用 Tinyint 数据类型时,存储数据的范围是从 0 到 255(每一个值要求 1 个字节存储空间),BIGINT 支持大范围的正负整数,可存储-2^63 ~2^63-1 的数值。
在数据类型优先次序表中,bigint 介于 smallmoney 和 int 之间。只有当参数表达
式为 bigint 数据类型时,函数才返回 bigint。SQL Server 不会自动将其他整数数据类型(tinyint、smallint 和 int)提升为 bigint
精确小数数据在 SQL Server 中的数据类型是 Decimal 和 Numeric。这种数据所
占的存储空间根据该数据的位数后的位数来确定。Decimal 数据类型使用 128 位来表示值来用作数值计算。
DECIMAL(p,s):其中 p 代表精度,最多可以存储十进制数字的总位数,包括小数点
左边和右边的位数。该精度必须是从 1 到最大精度 38 之间的值。默认精度为 18。
S 代表小数位数,小数点右边可以存储的十进制数字的最大位数。小数位数必须是从 0 到 p 之间的值。仅在指定精度后才可以指定小数位数。默认的小数位数为 0;因此, 0 <= s <= p。最大存储大小基于精度而变化。
数据类型 |
存储长度 |
取值范围 |
说明 |
FLOAT(n) |
4B 或 8B |
1.79E + 308~- 2.23E - 308、0 和 2. 23E – 308~1.79E + 308 |
存储大型浮点数 |
REAL |
4B |
-3.40E + 38 至 - 1.18E - 38 、 0 和 1.18E - 38 至 3.40E + 38 |
SQL-92 标准已被 f loat 替换 |
数据类型 |
存储长度 |
值域 |
说明 |
MONEY |
8B |
-922,337,203, 685,477. 5808 ~ 922,337,203,685,477.5807 |
存储大型货币值 |
SMALLMONEY |
4B |
-214,748.3648~214, 748.3647 |
存储小型货币值 |
数据类型 |
存储长度 |
取值范围 |
精度 |
DATE |
3B |
0001-01-01 到 9999-12-31 |
1 天 |
TIME |
3B~5B |
00:00:00.0000000 到 23:59:59.9999999 |
100 纳秒 |
SMALLDATETIME |
4B |
1900-01-01 到 2079-06-06 |
1 分钟 |
DATETIME |
8B |
1753-01-01 到 9999-12-31 |
0.00333 秒 |
DATETIME2 |
6B~8B |
0001-01-01 00:00:00.0000000 到 9999-12-31 23:59:59.9999999 |
100 纳秒 |
DATETIMEOFFSET |
8B~10B |
0001-01-01 00:00:00.0000000 到 9999-12-31 23:59:59.9999999(以 UTC 时间表示) |
100 纳秒 |
SQL Server 2005 数据库引擎用两个 4 字节的整数内部存储 datetime 数据类型的值。
存储长度 |
取值范围 |
说明 |
|
CHAR(n) |
1B~8000B |
最多 8000 个字符 |
固定长度 ANSI 数据类型 |
NCHAR(n) |
2B~8000B |
最多 4000 个字符 |
固定长度 Unicode 数据类型 |
VARCHAR(n) |
1B~8000B |
最多 8000 个字符 |
可变长度 ANSI 数据类型 |
VARCHAR(max) |
最大 2G |
最多 1 073 741 824 个字符 |
可变长度 ANSI 数据类型 |
NVARCHAR(n) |
2B~8000B |
最多 4000 个字符 |
可变长度 Unicode 数据类型 |
NVARCHAR(max) |
最大 2G |
最多 536 870 912 个字符 |
可变长度 Unicode 数据类型 |
TEXT |
最大 2G |
最多 1 073 741 824 个字符 |
可变长度 ANSI 数据类型 |
NTEXT |
最大 2G |
最多 536 870 912 个字符 |
可变长度 Unicode 数据类型 |
和二进制字符串数据类型。下面分别进行介绍。
- 、 非Unicode 字符串包括 3 种具体数据类型: Char,Varchar 和 Text
字符数据是由任何字母、符号和数字任意组合而成的数据。
Varchar 是变长字符数据,其长度不超过 8KB。Char 是定长字符数据,其长度最多为 8KB。超过 8KB 的ASCII 数据可以使用 Text 数据类型存储。例如,因为 Html 文档全部都是 ASCII 字符,并且在一般情况下长度超过 8KB,所以这些文档可以
Text 数据类型存储在SQL Server 中。非unicode 字符串数据类型:
如果未在数据定义或变量声明语句中指定 n,则默认长度为 1。如果在使用 CAST 和
CONVERT 函数时未指定 n,则默认长度为 30。
关于在何种情况下使用char 或nchar,SQL 中列出了下列几个原则。
- 如果列数据项的大小一致,则使用char。
- 如果列数据项的大小差异相当大,则使用 varchar。
- 如果列数据项大小相差很大,而且大小可能超过 8000 字节,请使用 varchar(max)。
- 、Unicode 字符串包括 3 种具体数据类型:Nchar,Nvarchar 和 Ntext
在Microsoft SQL Server 中,传统的非 Unicode 数据类型允许使用由特定字符集定义的字符。在 SQL Server 安装过程中,允许选择一种字符集。使用 Unicode 数据类型,列中可以存储任何由Unicode 标准定义的字符。在 Unicode 标准中,包括了以各种字符集定义的全部字符。使用 Unicode 数据类型,所战胜的是使用非 Unicode 数据类型所占用的大小的两倍。
在 SQL Server 中,Unicode 数据以 Nchar、Nvarchar 和 Ntext 数据类型存储。使用这种字符类型存储的列可以存储多个字符集中的字符。当列的长度变化时,应该 使用Nvarchar 字符类型,这时最多可以存储 4000 个字符。当列的长度固定不变时, 应该使用 Nchar 字符类型,同样,这时最多可以存储 4000 个字符。当使用 Ntext 数据类型时,该列可以存储多于 4000 个字符。
Unicode 字符串数据类型:
数据类型名称 |
解 释 |
nchar [ ( n ) ] |
n 个字符的固定长度的 Unicode 字符数据。n 值为 1~4000,存储大小 为两倍 n 字节 |
nvarchar [ ( n | max ) ] |
可变长度 Unicode 字符数据。n 值为 1~4000。max 指示最大存储大小为 231–1 字节。存储大小是所输入字符个数的两倍加 2 个字节。所输入 数据的长度可以为 0 个字符 |
ntext |
长度可变的 Unicode 数据,最大长度为 230–1 (1 073 741 823)个字符。 存储大小是所输入字符个数的两倍(以字节为单位) |
注意:关于何时使用 nchar 和nvarchar,其遵守的原则与非 Unicode 字符串的原则基本相同。可变长度数据类型具有变动长度的特性,因为VARCHAR 数据类型的存储长度为实际
数值长度,若输入数据的字符数小于 n ,则系统不会在其后添加空格来填满设定好的空间。
反之固定长度的类型如果输入字符长度比定义长度小,则在其后添加空格来填满长度。
char(nchar)与 varchar(nvarchar)的比较:
- 1 、数据存储开销。
- 每个 varchar 列需要额外的两个字节,用于反映存储的数据的长度。
-
- 每个可为NULL 的char 列,需要一些字节(空位图)来反应数据的为空性。
-
- 无论实际数据的长度是多少,char 按照定义的长度分配存储空间,为定长型。
-
- varchar 是变长字符数据类型,根据实际存储的数据长度来分配数据存储空间。
- 2 、NULL 值(空值)。
- char 列的NULL 值占用存储空间。
-
- varcahr 列的NULL 值不占用存储空间。
-
- 插入同样数量的NULL 值,varchar 列的插入效率明显高出char 列。选择 char 还是选择varchar 的建议:
- 1 、适宜于char 的情况:
- 列中的各行数据长度基本一致,长度变化不超过 50 字节;
-
- 数据变更频繁,数据检索的需求较少。
create table tb1 (col varchar(100)) go
insert into tb1 values('0123456789')