SQL Server数据库之数据类型

一、数据存储单位

1.位(bit)

数据存储的最小单位。每个二进制数字0或者1就是个位。

2.字节(B、byte)

  • 1 byte(字节) = 8 bit(位) 8个位构成一个字节
  • 1 KB = 1024 B (2^10B)
  • 1 MB = 1024 KB (2^20B)
  • 1 GB = 1024 MB (2^30B)
  • 1 TB = 1024 GB (2^40B)

3.字符

单个字母、汉字、特殊符号(a、A、中、+、*、の…)均表示一个字符。
一般 utf-8 编码下,一个汉字字符占用 3 个字节
一般 gbk 编码下,一个汉字字符占用 2 个 字节

一、系统数据类型

(一)精确数字

1.整数

数据类型范围大小
bigint从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字)8bit
int从 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据(所有数字)4bit
smallint从 -2^15 (-32,768) 到 2^15 - 1 (32,767) 的整数数据2bit
tinyint从 0 到 255 的整数数据1bit
bit整型数据 1、0 或 NULL1bit

2.小数

  • 精度:数中的数字个数。123.45的精度是5
  • 小数位数:数中小数点右边的数字个数。123.45小数位数是2
  • 数字数据类型的长度:存储此数据类型所占用的字节数
decimal[(p[, s])] 和 numeric[(p[, s])]

使用最大精度时,有效值从 - 10^38 +1 到 10^38 - 1。

1° p(精度)

指定小数点左边和右边可以存储的十进制数字的最大个数。精度必须是从 1 到最大精度之间的值。最大精度为 38。

2° s(小数位数)

指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从 0 到 p 之间的值。默认小数位数是 0,因而 0 <= s <= p。最大存储大小基于精度而变化。

精度存储字节数
1 - 95
10 - 199
20 - 2813
29 - 3817

3.货币

数据类型范围大小
money货币数据值介于 -2^63 (-922,337,203,685,477.5808) 与 2^63 - 1 (+922,337,203,685,477.5807) 之间,精确到货币单位的千分之十8bit
smallmoney货币数据值介于 -214,748.3648 与 +214.748,3647 之间,精确到货币单位的千分之十4bit

(二)近似数字

用于表示浮点数字数据的近似数字数据类型。浮点数据为近似值;并非数据类型范围内的所有数据都能精确地表示。

1.float [ ( n ) ]

从 - 1.79E + 308 到 1.79E + 308 之间的浮点数字数据。n 为用于存储科学记数法 float 数尾数的位数,同时指示其精度和存储大小。n 必须为从 1 到 53 之间的值。

n所在范围精度存储大小
1 - 247位数4字节
25 - 5315位数8字节

2.real

从 -3.40E + 38 到 3.40E + 38 的浮点精度数字。存储大小为 4 字节。

(三)日期和时间数据

1.datetime

从 1753 年 1 月 1 日到 9999 年 12 月 31 日的日期和时间数据,精确度为百分之三秒(等于 3.33 毫秒或 0.00333 秒)。
注:Microsoft SQL Server 用两个 4 字节的整数内部存储 datetime 数据类型的值。第一个 4 字节存储 base date(即 1900 年 1 月 1 日)之前或之后的天数。基础日期是系统参考日期。不允许早于 1753 年 1 月 1 日的 datetime 值。另外一个 4 字节存储以午夜后毫秒数所代表的每天的时间。

2.smalldatetime

从 1900 年 1 月 1 日到 2079 年 6 月 6 日的日期和时间数据精确到分钟。

  • 不高于29.998 秒的 smalldatetime 值向下舍入为最接近的分钟
  • 超过29.999 秒的 smalldatetime 值向上舍入为最接近的分钟
--returns time as 12:35
SELECT CAST('2000-05-08 12:35:29.998' AS smalldatetime)
GO
--returns time as 12:36
SELECT CAST('2000-05-08 12:35:29.999' AS smalldatetime)
GO

注:smalldatetime 数据类型存储日期和每天的时间,但精确度低于 datetime。SQL Server 将 smalldatetime 的值存储为两个 2 字节的整数。第一个 2 字节存储 1900 年 1 月 1 日后的天数。另外一个 2 字节存储午夜后的分钟数。日期范围从1900 年 1 月 1 日到 2079 年 6 月 6 日,精确到分钟。

(四)二进制数据

1.binary [ ( n ) ]

固定长度的 n 个字节二进制数据。N 必须从 1 到 8,000。存储空间大小为 n+4 字节。

2.varbinary [ ( n ) ]

n 个字节可变二进制数据。n 必须从 1 到 8,000。存储空间大小为实际输入数据长度 +4 个字节,而不是 n 个字节。输入的数据长度可能为 0 字节。
注:如果在数据定义或变量声明语句中没有指定 n,默认长度为 1。如果没有用 CAST 函数指定 n,默认长度为 30。
当列数据项大小一致时应使用 binary。
当列数据项大小不一致时应使用 varbinary。

3.image

可变长度的二进制数据,其最大长度为 2^31 - 1 (2,147,483,647) 个字节。

(五)字符数据

1.char[(n)]

长度为 n 个字节的固定长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为 n 个字节。

2.varchar[(n)]

长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 可以是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。所输入的数据字符长度可以为零。

3.text

可变长度的非 Unicode 数据,最大长度为 2^31 - 1 (2,147,483,647) 个字符。

(六)Unicode 数据

双字节

1.nchar(n)

固定长度的 Unicode 数据,最大长度为 4,000 个字符。

2.nvarchar(n)

可变长度 Unicode 数据,其最大长度为 4,000 字符。sysname 是系统提供用户定义的数据类型,在功能上等同于 nvarchar(128),用于引用数据库对象名。

3.ntext

可变长度 Unicode 数据,其最大长度为 2^30 - 1 (1,073,741,823) 个字符。

二、用户自定义数据类型

用户定义的数据类型基于在 Microsoft SQL Server 中提供的数据类型。当几个表中必须存储同一种数据类型时,并且为保证这些列有相同的数据类型、长度和可空性时,可以使用用户定义的数据类型。

(一)创建用户自定义数据类型

1. sp_addtype

创建用户定义的数据类型可以使用系统存储过程 sp_addtype

(1)语法

sp_addtype [ @typename = ] type,
[ @phystype = ] system_data_type
[ , [ @nulltype = ] ‘null_type’ ]
[ , [ @owner = ] ‘owner_name’ ]

(2)参数
1° [@typename =] type

用户定义的数据类型的名称。数据类型名称必须遵照标识符的规则,而且在每个数据库中必须是唯一的。type 的数据类型为 sysname,没有默认值。

2° [@phystype =] system_data_type

是用户定义的数据类型所基于的物理数据类型或 Microsoft® SQL Server™ 提供的数据类型(decimal、int 等等)。system_data_type 的数据类型是 sysname,没有默认值。

3° [@nulltype =] ‘null_type’

指明用户定义的数据类型处理空值的方式。null_type 的数据类型为 varchar(8),默认值为 NULL,并且必须用单引号引起来(‘NULL’、‘NOT NULL’ 或 ‘NONULL’)。如果没有用 sp_addtype 显式定义 null_type,则将其设置为当前默认的为空性。使用 GETANSINULL 系统函数可确定当前默认的为空性,可以使用 SET 语句或 sp_dboption 对该为空性进行调整。应显式定义为空性。

4° [@owner =] ‘owner_name’

指定新数据类型的创建者或所有者。owner_name 的数据类型为 sysname。当没有指定时,owner_name 为当前用户。

(3)示例

例:为数据库teachingDataA创建一个用户定义的数据类型Sname,该数据类型为基于系统数据类型变长为8的字符,且不允许为空。

use teachingDataA
Exec sp_addtype Sname, 'Varchar(8)','Not Null'

注:varchar(8) 由单引号引了起来,这是因为它包含了标点符号(圆括号)。

2.CREATE TYPE

在SQL-Server 2005之后的后续版本中,sp_addtype将不再可用,取而代之的是CREATE TYPE语句。

(1)语法
CREATE TYPE type_name
{
FROM base_type
[ ( precision [, scale ] ) ]
[ NULL | NOT NULL ]
}
(2)参数

typename:用户自定义的数据类型的名称。
base_type:表示建立的数据类型所基于的由SQL Server提供的数据类型。当建立decimal或numeric类型时,需要用precision来指定总位数,用scale来指定小数位数。
NULL | NOT NULL:指定此类型是否可容纳空值。如果未指定,则默认为NULL。

(3)示例

例:为数据库teachingDataB自定义一个工作部门myDept的数据类型为varchar(20),允许为空。

CREATE TYPE myDept FROM varchar(20) 

3.界面设置

在Microsoft SQL Server Management Studio的对象资料管理器中展开【可编程性】|【类型】,右击【用户定义数据类型】,选择【新建用户定义数据类型】命令,打开【新建用户定义数据类型】,输入自定义的数据类型名,选择数据类型,设置长度设定,确定是否允许空值(通过勾选【允许空值】进行设置),完成后单击【确定】。

(二)删除用户自定义数据类型

1.sp_droptype

当用户定义的数据类型不需要时,可以用命令sp_droptype将其删除。

exec sp_droptype {’type_name’} 

2.界面设置

在Microsoft SQL Server Management Studio的对象资料管理器中展开【可编程性】|【类型】|【用户定义数据类型】,右击要删除的数据类型,选择“删除”。

三、数据类型的转换

(一)数据类型的优先顺序

当两个不同数据类型的表达式用运算符组合后,数据类型的优先顺序规则确定哪种数据类型要向另一种转换。优先顺序的数据类型向优先顺序的数据类型转换。如果此转换不是所支持的固有转换,则返回错误。当两个操作数表达式有相同的数据类型时,运算的结果就为那种数据类型。

sql_variant > datetime > smalldatetime > float > real > decimal > money > smallmoney > bigint > int > smallint > tinyint > bit > ntext > text > image > timestamp > uniqueidentifier > nvarchar > nchar > varchar > char > varbinary > binary

(二)排序规则的优先顺序

排序规则的优先顺序规则只适用于字符串数据类型:char、varchar、text、nchar、nvarchar 和 ntext。

操作数强制标志显性X隐性X强制默认无排序规则
显性Y生成错误结果为显性Y结果为显性Y结果为显性Y
隐性Y结果为显性X结果为无排序规则结果为隐性Y结果为无排序规则
强制默认结果为显性X结果为隐性X结果为强制默认结果为无排序规则
无排序规则结果为显性X结果为无排序规则结果为无排序规则结果为无排序规则
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值