SQL Server 2008之数据类型简析(二)
这些标准在MSDOS操作系统中就被称为代码页,一个代码页就定义128-255之间的字符的用途,这些代码页0-127之间的字符定义都是相同的
共有两类Collations:SQL Server Collations和Windows Collations,SQL Server Collations用来保持向后兼容性,鼓励使用Windows Collations,SQL Server Collations名称采用如下形式:SQL_SortRules[_Pref]_CPCodePage_ComparisonStyle
SortRules:使用的字母表或者语言
Pref:是否大写字母优先
CodePage:代码页,1-4位整数,由于历史原因CP1使用的是1252代码页,其他正常
Comparison Style:BIN表示按二进制排序或者case、accent是否敏感的组合,CI不区分大小写,CS区分大小写,AI不区分语调,AS区分语调
可以在服务器、数据库、列级别设置Collations,当比较使用不同的Collations存储的数据时,要求指定用于比较的Collations
CAST是ANSI SQL中标准的数据类型转换操作符,Convert则提供了更加强大的功能,允许你指定如何执行类型转换,即允许指定转换的格式Style,注意Style通常是关于字符串输出的,但是也可以用来处理字符串输入,即解析字符串
尽量避免隐式转换,因为隐式转换可能会带来非期望的结果,隐式转换经常出现的问题:
为目标类型指定了不恰当的值,比如不恰当字符串转换为int值
为目标类型指定值超出了该类型的范围,比如为tinyint类型指定了300
在转换时值被截断(有时是悄悄的),比如CONVERT(varchar(6),SYSDATETIME(),112),112格式通常返回8位字符串,当转换为6位字符串时,就被悄悄截断
在转换时值被舍入(有时是悄悄的),比如datetime类型值20051231 23:59:59.999被悄悄转换为20060101 00:00:00.000
在转换时值被修改(有时是悄悄的),SELECT 5ee,被悄悄修改为5
对数据类型内部存储做假设,依赖于数据类型内部存储是非常危险的,因为内部表示随着时间会发生变化
www.2cto.com
一些日期类型转换依赖于语言设置,比如2010-05-04即可以转换为2010年5月4日,也可以转换为2010年4月5日
有一些解析问题难以理解,比如SELECT 5ee
rowversion数据类型是用来帮助处理并发的,之前SQL Server使用的是timestamp,现在timestamp已经被弃用;在每次修改数据行时,rowversion值都自动被修改,当你要提交数据修改时,首先检查是否存在rowversion值的行,如果不存在,则说明数据已经被修改,此时在使用相应的策略,注意这里存在竟态条件,即你检查时没有发现数据被修改,但是提交前数据却被修改;rowversion在数据库中保存一个计数器,所有修改都会让计数器增加,可以使用系统变量@@DBTS检索返回的rowversion值
Alias data types就是系统内置数据类型的子类型,使用CREATE TYPE语句创建,包含了是否可以为null的说明,通常用来维护应用程序中使用的数据类型的一致性(比如定义了ProductNum类型,其为nvarchar(20),则使用ProductNum定义的列都是nvarchar(20),不会出现在一个表中product number是nvarchar(20),在另一个表中是nvarchar(22));数据库公共角色都自动被授予对Alias data types的REFERENCES权限,即公共角色都自动可以引用创建的Alias data types
其他数据类型:
binary、varbinary、varbinary(max):用来存储任意的大的二进制对象(blobs)
image:已经被遗弃,应该使用varbinary(max)
hierarchyid:是在托管代码中实现的,代表树中的节点
sql_variant:用来存储未知类型的数据,很少使用
xml
cursor:在构造基于游标的代码时,保存对游标的引用
table:保存整个结果集
geometry、geography