惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Help Net Security
Help Net Security
G
Google Developers Blog
雷峰网
雷峰网
WordPress大学
WordPress大学
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Engineering at Meta
Engineering at Meta
Security Latest
Security Latest
T
Threat Research - Cisco Blogs
AWS News Blog
AWS News Blog
F
Full Disclosure
C
Cybersecurity and Infrastructure Security Agency CISA
T
The Exploit Database - CXSecurity.com
J
Java Code Geeks
U
Unit 42
C
Cyber Attacks, Cyber Crime and Cyber Security
V
V2EX
C
Cisco Blogs
博客园 - 司徒正美
Project Zero
Project Zero
L
LINUX DO - 热门话题
阮一峰的网络日志
阮一峰的网络日志
Blog — PlanetScale
Blog — PlanetScale
Scott Helme
Scott Helme
A
About on SuperTechFans
Hugging Face - Blog
Hugging Face - Blog
S
Securelist
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
S
Schneier on Security
G
GRAHAM CLULEY
酷 壳 – CoolShell
酷 壳 – CoolShell
Cyberwarzone
Cyberwarzone
MongoDB | Blog
MongoDB | Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 叶小钗
T
Threatpost
Recorded Future
Recorded Future
C
CXSECURITY Database RSS Feed - CXSecurity.com
宝玉的分享
宝玉的分享
N
News and Events Feed by Topic
人人都是产品经理
人人都是产品经理
The Register - Security
The Register - Security
S
Security Archives - TechRepublic
博客园 - Franky
N
News | PayPal Newsroom
Simon Willison's Weblog
Simon Willison's Weblog
S
SegmentFault 最新的问题
W
WeLiveSecurity
A
Arctic Wolf
B
Blog

博客园 - 马啸西风

SQL Server 2008之XML数据存储 SQL Server 2008之托管代码 SQL Server 2008之触发器 SQL Server 2008之约束 SQL Server 2008之用户自定义函数 SQL Server 2008之错误处理 SQL Server 2008之创建高并发应用程序 SQL Server 2008之合并数据和表传递 SQL Server 2008之存储过程的设计和实现 SQL Server 2008之通过非聚集索引提高性能 SQL Server 2008之读取查询计划 SQL Server 2008之表结构实现 SQL Server 2008之索引设计 SQL Server 2008之视图的设计和实现 SQL Server 2008之表的设计和实现 启用Application library caching时,将多个不同步的程序集打包到一个ZIP包中的问题 垃圾收集导致的概率性发生的bug DataGridView中下拉列表框的实现 C#之集合
SQL Server 2008之数据类型
马啸西风 · 2012-12-22 · via 博客园 - 马啸西风
  1. 数据类型的选择帮助优化查询,比如针对int类型列和针对文本类型列可能会生成完全不同的查询计划
  1. 三种数据类型:
  • 系统数据类型
  • 别名数据类型:用户可以为系统数据类型提供一个别名,并且可以对数据类型做进一步限制,这样可以保持数据库和应用程序的一致性
  • 用户自定义数据类型:引入的托管代码中的数据类型,包括CLR中的系统数据类型和CLR中用户自定义数据类型
  1. 整数数据类型:
  • tinyint存储的是一个字节(8位),值范围是0-255
  • smallint存储的是两字节(16位),值范围是-32768-32767
  • int存储的是四字节(32位),值范围是-2147483648-2147483647
  • bigint存储的是八字节,值范围是-2^63 - 2^63-1,存储的是非常大的整数值
  1. 分数数据类型:
  • decimalANSI兼容,允许指定整数位和小数位
  • numeric:功能上和decimal是一样的
  • moneysmallmoney:以前遗留下来的数据类型,用来存储货币值,四个小数位精度,通常使用decimal代替这个数据类型
  1. bit数据类型:存储1位值,存储上有优化,如果一张表中少于8个的bit列,他们将被存储在一个字节中,通常用来存储boolean值;在SQL Serverbit值没有字符串形式,TrueFalse只是可以转化为bit值,就像整数值10可以转化为bit值一样,底层bit值存储的不是TrueFalse,也不是整数值10,而只是一位值而已;高级语言中False都使用0来存储,而True存储根据语言不同使用不同的值,因此在检测boolean值时,使用@inputvalue=0来检测false,使用@inputvalue<>0来检测true,不要使用@inputvalue=1来检测true值,在有的语言中得不到预期的结果;bit类型值还可以存储null值,也就是说bit类型值共有三种状态0,1,null
  2. IDENTITYint或者bitint列一起使用,通过SET IDENTITY_INSERT ON开关,允许在IDENTITY列显式插入值,具有IDENTITY属性的列不能够保证值都唯一,因为可以显式插入值;可以通过系统变量@@IDENTITY检索最近一次IDENTITY值,使用@@IDENTITY的问题是:当插入一条记录到Customer表中时,这个customer被赋予一个新的identity,但是如果这个表有一个触发器,这个触发器在插入时将这个条目写入到audit logging table中,@@IDENTITY返回的是logging table值,而不是Customer表的值;此时需要使用SCOPE_IDENTITY函数,它提供的是当前范围Scope内最新identity值;当一次插入多行记录时,通过OUTPUT语句检索IDENTITY值(通过检索inserted表来检索该值),插入一条记录时,使用这种方法也可以检索插入的值
  3. 近似数据类型通常用在科学计算应用程序中,而不是商业应用程序中,不要使用近似数据类型存储货币值这样的商业值
  • real:存储的是4字节(32位),精确到7位小数
  • float(n)n代表用来存储尾数的位数,n默认等于53,当n1-24范围时,n=24,即精度为7位小数,使用4字节存储,也就是real数据类型的值;当n25-53范围时,n=53,即精度15位小数,使用8字节存储
  1. SQL Server支持丰富的日期和时间数据类型,需要非常小心每个类型的字符串形式,大量函数可用来处理这些类型
  • date:符合ANSI标准,范围0001-01-01 to 9999-12-31,精确到天
  • time:符合ANSI SQL标准,范围00:00:00.0000000 to 23:59:59.9999999,精确到100纳秒,允许指定小数位数,即定义纳秒的位数
  • datetime2:是datetime类型的组合
  • datetime:旧版本的日期时间类型,范围1753-01-01 to 9999-12-31,精确到3.33毫秒,datetime类型根据语言设置将字符串转化为日期,"YYYYMMDD"总是可以转化为正确的日期时间类型,"YYYY-MM-DD"可能会被当做"YYYY-DD-MM"格式进行转化,取决于设置,date类型不会有这样的行为
  • datetimeoffset datetime2timezone offset的组合,日期时间部分代表本地时间,timezone offset范围-14:00 to +14:00,表示和UTC时间的偏移量,注意date类型是和时区无关的
  1. GUID就是一个数字分配器,保证一个程序生成的值和其他程序生成的值不冲突,是128位值;在SQL Server中对应的数据类型就是uniqueidentifier,该类型允许的操作只包括=<><><=>=以及是否为null的检测IS NULL IS NOT NULL;该数据类型定义的列上不允许使用IDENTITY;通过NEWID()函数生成新的GUID值,该函数生成的GUID值具有非常大的随机性,有性能问题,NEWSEQUENTIALID()函数试图解决NEWID()函数的随机性,不过它是以牺牲唯一性为代价的
  1. NULL是数据库列的状态,不是数据类型的值,使用IS NULL检测是否为null,而不是使用=NULL检测是否等于null;为数据库列指定不当的nullability是常见的设计错误
  1. Unicode常量要求在前面都加上N前缀,使用LEN()函数返回字符的数量,使用DATALENGTH()返回字节数量
  1. 字符数据类型:
  • charnchar:存储固定长度的字符,如果这两个类型值的字符长度不够的话,在尾部使用空格填充,使用时通常都需要去掉尾部的空格,char使用单字节存储,nchar采用双字节存储
  • varcharnvarchar:用来存储变长字符串,允许你指定一个字符串的最大长度,nvarchar用来存储unicode字符(即双字节字符),varcharnvarchar限制在80004000个字符上限,正好是数据库中一个数据页的大小
  • varchar(max)nvarchar(max):存储更长的字符,它们允许存储高达2GB的数据
  • textntext:旧数据类型,被启用,使用varchar(max)nvarchar(max)替换这两个数据类型
  • sysnameSQL Server中对象名称通常都是该类型,是nvarchar(128)的别名
  1. Collation用来控制在SQL Server中存储的非Unicode数据使用的代码页,以及SQL Server中排序和比较字符值时使用的规则
  • code pages代码页:在计算机中每个字符使用一个字节,共有256个字符,0-31作为控制字符,比如回车(8)、Tab9)、空格(32),一直到Delete127);127以上的值则根据标准不同表示不同的含义,这些标准在MSDOS操作系统中就被称为代码页,一个代码页就定义128-255之间的字符的用途,这些代码页0-127之间的字符定义都是相同的
  1. 共有两类CollationsSQL Server CollationsWindows CollationsSQL Server Collations用来保持向后兼容性,鼓励使用Windows CollationsSQL Server Collations名称采用如下形式:SQL_SortRules[_Pref]_CPCodePage_ComparisonStyle
  • SortRules:使用的字母表或者语言
  • Pref:是否大写字母优先
  • CodePage:代码页,1-4位整数,由于历史原因CP1使用的是1252代码页,其他正常
  • Comparison StyleBIN表示按二进制排序或者caseaccent是否敏感的组合,CI不区分大小写,CS区分大小写,AI不区分语调,AS区分语调
  1. 可以在服务器、数据库、列级别设置Collations,当比较使用不同的Collations存储的数据时,要求指定用于比较的Collations
  1. CASTANSI SQL中标准的数据类型转换操作符,Convert则提供了更加强大的功能,允许你指定如何执行类型转换,即允许指定转换的格式Style,注意Style通常是关于字符串输出的,但是也可以用来处理字符串输入,即解析字符串
  1. 尽量避免隐式转换,因为隐式转换可能会带来非期望的结果,隐式转换经常出现的问题:
  • 为目标类型指定了不恰当的值,比如不恰当字符串转换为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
  • 对数据类型内部存储做假设,依赖于数据类型内部存储是非常危险的,因为内部表示随着时间会发生变化
  • 一些日期类型转换依赖于语言设置,比如2010-05-04即可以转换为201054日,也可以转换为201045
  • 有一些解析问题难以理解,比如SELECT 5ee
  1. rowversion数据类型是用来帮助处理并发的,之前SQL Server使用的是timestamp,现在timestamp已经被弃用;在每次修改数据行时,rowversion值都自动被修改,当你要提交数据修改时,首先检查是否存在rowversion值的行,如果不存在,则说明数据已经被修改,此时在使用相应的策略,注意这里存在竟态条件,即你检查时没有发现数据被修改,但是提交前数据却被修改;rowversion在数据库中保存一个计数器,所有修改都会让计数器增加,可以使用系统变量@@DBTS检索返回的rowversion
  1. Alias data types就是系统内置数据类型的子类型,使用CREATE TYPE语句创建,包含了是否可以为null的说明,通常用来维护应用程序中使用的数据类型的一致性(比如定义了ProductNum类型,其为nvarchar(20),则使用ProductNum定义的列都是nvarchar(20),不会出现在一个表中product numbernvarchar(20),在另一个表中是nvarchar(22));数据库公共角色都自动被授予对Alias data typesREFERENCES权限,即公共角色都自动可以引用创建Alias data types
  1. 其他数据类型:
  • binaryvarbinaryvarbinary(max):用来存储任意的大的二进制对象(blobs
  • image:已经被遗弃,应该使用varbinary(max)
  • hierarchyid:是在托管代码中实现的,代表树中的节点
  • sql_variant:用来存储未知类型的数据,很少使用
  • xml
  • cursor:在构造基于游标的代码时,保存对游标的引用
  • table:保存整个结果集
  • geometrygeography

发表于 2012-12-22 23:11  马啸西风  阅读(7217)  评论()    收藏  举报

Powered By 博客园