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. 分数数据类型:
  • decimal:ANSI兼容,允许指定整数位和小数位
  • numeric:功能上和decimal是一样的
  • money、smallmoney:以前遗留下来的数据类型,用来存储货币值,四个小数位精度,通常使用decimal代替这个数据类型
  1. bit数据类型:存储1位值,存储上有优化,如果一张表中少于8个的bit列,他们将被存储在一个字节中,通常用来存储boolean值;在SQL Server中bit值没有字符串形式,True和False只是可以转化为bit值,就像整数值1、0可以转化为bit值一样,底层bit值存储的不是True或False,也不是整数值1、0,而只是一位值而已;高级语言中False都使用0来存储,而True存储根据语言不同使用不同的值,因此在检测boolean值时,使用@inputvalue=0来检测false,使用@inputvalue<>0来检测true,不要使用@inputvalue=1来检测true值,在有的语言中得不到预期的结果;bit类型值还可以存储null值,也就是说bit类型值共有三种状态0,1,null
  2. IDENTITY和int或者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,当n在1-24范围时,n=24,即精度为7位小数,使用4字节存储,也就是real数据类型的值;当n在25-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:是date和time类型的组合
  • datetime:旧版本的日期时间类型,范围1753-01-01 to 9999-12-31,精确到3.33毫秒,datetime类型根据语言设置将字符串转化为日期,"YYYYMMDD"总是可以转化为正确的日期时间类型,"YYYY-MM-DD"可能会被当做"YYYY-DD-MM"格式进行转化,取决于设置,date类型不会有这样的行为
  • datetimeoffset: datetime2和timezone 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. 字符数据类型:
  • char和nchar:存储固定长度的字符,如果这两个类型值的字符长度不够的话,在尾部使用空格填充,使用时通常都需要去掉尾部的空格,char使用单字节存储,nchar采用双字节存储
  • varchar和nvarchar:用来存储变长字符串,允许你指定一个字符串的最大长度,nvarchar用来存储unicode字符(即双字节字符),varchar和nvarchar限制在8000和4000个字符上限,正好是数据库中一个数据页的大小
  • varchar(max)和nvarchar(max):存储更长的字符,它们允许存储高达2GB的数据
  • text和ntext:旧数据类型,被启用,使用varchar(max)和nvarchar(max)替换这两个数据类型
  • sysname:SQL Server中对象名称通常都是该类型,是nvarchar(128)的别名
  1. Collation用来控制在SQL Server中存储的非Unicode数据使用的代码页,以及SQL Server中排序和比较字符值时使用的规则
  • code pages代码页:在计算机中每个字符使用一个字节,共有256个字符,0-31作为控制字符,比如回车(8)、Tab(9)、空格(32),一直到Delete(127);127以上的值则根据标准不同表示不同的含义,这些标准在MSDOS操作系统中就被称为代码页,一个代码页就定义128-255之间的字符的用途,这些代码页0-127之间的字符定义都是相同的
  1. 共有两类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区分语调
  1. 可以在服务器、数据库、列级别设置Collations,当比较使用不同的Collations存储的数据时,要求指定用于比较的Collations
  1. CAST是ANSI 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即可以转换为2010年5月4日,也可以转换为2010年4月5日
  • 有一些解析问题难以理解,比如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 number是nvarchar(20),在另一个表中是nvarchar(22));数据库公共角色都自动被授予对Alias data types的REFERENCES权限,即公共角色都自动可以引用创建的Alias data types
  1. 其他数据类型:
  • binary、varbinary、varbinary(max):用来存储任意的大的二进制对象(blobs)
  • image:已经被遗弃,应该使用varbinary(max)
  • hierarchyid:是在托管代码中实现的,代表树中的节点
  • sql_variant:用来存储未知类型的数据,很少使用
  • xml
  • cursor:在构造基于游标的代码时,保存对游标的引用
  • table:保存整个结果集
  • geometry、geography

SQL Server 数据类型的更多相关文章

  1. 为更好地设计数据库,重新整理sql server数据类型

    我们在平常开发过程中,在设计数据的时候,经常碰到数据类型选择的问题,为了更快,更合适地选择正确的数据类型,所以在这里做个总结. 分类 sql server 数据类型 c# 数据类型 描述 应用场景 字 ...

  2. SQL Server 数据类型映射

    SQL Server 和 .NET Framework 基于不同的类型系统. 例如,.NET Framework Decimal 结构的最大小数位数为 28,而 SQL Server 的 decima ...

  3. MySql和SQL Server数据类型 对比

    My Sql 数据类型 SQL Server 数据类型 Yes/No bit Smallint(字节型) tinyint Integer(长整型) int Real(单精度浮点型)    real F ...

  4. SQL Server数据类型与SDE库表sde_type对照表

    SDE_column_registry 表管理所有注册列. 警告:如果使用 SQL 界面更改列定义,SDE_column_registry 表中的记录将不会更新.这可能导致之后的任何数据导出失败. S ...

  5. SQL Server 数据类型映射 (ADO.NET)

    SQL Server 数据类型映射 (ADO.NET) .NET Framework 3.5 更新:November 2007 SQL Server 和 .NET Framework 基于不同的类型系 ...

  6. SQL Server数据类型

    转载:http://www.ezloo.com/2008/10/sql_server_data_type.html    数据类型是数据的一种属性,是数据所表示信息的类型.任何一种语言都有它自己所固有 ...

  7. SQL Server 数据类型 Decimal介绍

    为SQL Server 数据类型,属于浮点数类型.存储数据范围是: -1038~1038-1 的固定精度和小数位的数字.一个decimal类型的数据占用了2~17个字节.decimal数据类型在SQL ...

  8. SQL Server数据类型int、bigint、smallint、tinyint对比表

    SQL Server数据类型int.bigint.smallint.tinyint对比表 数据类型 范围 存储 bigint -2^63 (-9,223,372,036,854,775,808) 到 ...

  9. SQL Server 数据类型映射(转载)

    SQL Server 数据类型映射 SQL Server 和 .NET Framework 基于不同的类型系统. 例如,.NET Framework Decimal 结构的最大小数位数为 28,而 S ...

  10. Sql Server 数据类型与 C# 数据类型对照

    Sql Server 数据类型与 C# 数据类型对照 已验证类型(Sql Server 2012 & Visual Studio 2013) Sql Server C# 简写 bigint S ...

随机推荐

  1. XH

    1.  又到父亲节,那就给老爹做顿饭呗,让他开心开心. 老爸吃了一口我炒的菜,流露出感动的泪花说:儿呀,你能为爸爸做饭,爸爸感到特别开心,但是你这个菜,看在今天是父亲节 我能不能不吃呀! 2.  一哥 ...

  2. navigationcontroller剖析

    概述: 系统原生的navigationcontroller非常强大, 几乎所有的程序都基于系统的导航控制器做开发 它的navigationbar的有2种形态 navigationbar的frame其实 ...

  3. Android学习笔记(七)——常见控件

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! Android 给我们提供了大量的 UI控件,下面我们简单试试几种常用的控件. 一.TextView 在布局文 ...

  4. 关于promise(一)

    该新特性属于 ECMAScript 2015(ES6)规范,在使用时请注意浏览器兼容性. 由于ES6原生提供Promise,所以无需安装Promise库.但在ES5环境下我们可以使用bluebird库 ...

  5. BZOJ 3445: [Usaco2014 Feb] Roadblock

    Description 一个图, \(n\) 个点 \(m\) 条边,求将一条边距离翻倍后使 \(1-n\) 最短路径增加的最大增量. Sol Dijstra. 先跑一边最短路,然后枚举最短路,将路径 ...

  6. python操作memcached以及分布式

    memcached 是以 LiveJournal 旗下 Danga Interactive 公司的 Brad Fitzpatric 为首开发的一款软件.现在已成为 mixi.Facebook.Live ...

  7. Python连接MySQL的准备工作

    首先要安装MySQL,64位的win7可以安装64或者32位的MySQL版本,安装之后,python需要一个工具才能连接MySQL,这个工具叫MySQL-python,去这里或者这里下载1.2.3版本 ...

  8. python查找并删除相同文件-UNIQ File-script版本

    今天用wxPython做了一个GUI程序,实现查找指定目录内的相同文件,主要原理是计算文件的md5值(计算前先找出文件大小相同的文件,然后计算这些文件的md5值,而不是所有文件都计算,大大减少了md5 ...

  9. DIV UL LI

    <style type="text/css"> .productDetailTabNav{ width:960px;} .productDetailTabNav ul{ ...

  10. FREE 开源 API 管理工具等

    最近学习API 管理工具,发现几个不错的东西,记录如下: 1.IBM 收购NODE 厂家  STRONGLOOP 有一产品LOOPBACK,开源,好! 2.apigee  api管理平台 也不错. 3 ...