字符数据类型
SQL Server 支持两种字符数据类型——常规和 Unicode。常规数据类型包括 CHAR 和 VARCHAR,Unicode 数据类型包括 NCHAR 和 NVARCHAR。常规字符的每个字符使用1个字节存储,而 Unicode 数据的每个字符要求2个字节,并且需要一个代理项对时,要求4个字节。常规字符文本可以用单引号表示,Unicode 字符文本需要指定字符串N(National)作为前缀。
名称中没有 VAR 元素的任何数据类型(CHAR、NCHAR)具有固定长度,SQL Server 会按照列定义的大小保留行空间,而不是按照字符串中的实际字符数保留空间。由于在字符串扩展时不需要扩展行,固定长度的数据类型更适合于针对写入的系统,但是固定长度字符串的存储消耗不是最佳的,在读取数据时则需要付出更多的成本。
名称中含有 VAR 元素的数据类型(VARCHAR、NVARCHAR)具有可变长度,SQL Server 根据存储需求在行中使用尽可能多的存储空间存储字符串,同时外加两个额外的字节用于偏移数据。由于这些数据类型的存储消耗小于固定长度类型,读取操作速度会更快。但是更新数据可能会导致行扩展,从而导致数据移动到当前页面之外,因此可变长度数据类型的数据更新效率低于固定长度数据类型的更新。
可以使用 MAX 说明符来定义可变长度数据类型,而不是使用最大字符数。定义 MAX 说明符后,大小在某个特定阈值(默认8000字节)内的任何值都可以内置存储在行内,超过阈值的任何值会作为大型对象(LOB)存储在行的外部。
排序规则
排序规则是一个字符数据属性,其封装了多项内容,包括语言支持、排序顺序、区分大小写、区分重音等。若想获得所支持的排序规则及其说明的结果集,可以通过查询表函数 fn_helpcollations:SELECT name, description FROM sys.fn_helpcollations()
。例如,排序规则 Latin1_General_CI_AS 的说明:
- Latin1_General 使用代码页1252(支持英语和德语字符,以及大多数西欧国家使用的字符);
- Dictionary sorting 排序和比较字符数据基于字典顺序(A和a < B和b);
- CI 数据不区分大小写(a=A);
- AS 数据区分重音(à<>ä);
由于字典顺序是默认顺序,如果没有显示地定义其它排序,可以说是使用了字典顺序。具体来说,就是元素 BIN 没有出现在排序规则名称中。如果出现了 BIN 元素,则意味着字符数据的排序和比较是基于字符的二进制表示形式的(A < B < a < b)。
在(企业)内部部署的SQL Server实施中,排序规则可以定义在4个不同层级:实例、数据库、列和表达式,SQL Server将使用最低有效级别的排序规则。实例的排序规则是安装程序选择的一部分,它确定所有系统数据库的排序规则,并作为用户数据库的默认规则。当创建一个用户数据库时,可以使用 COLLATE 子句指定数据库的排序规则,否则实例的排序规则将使用默认规则。
数据库的排序规则决定了数据库对象元数据的排序规则,并默认应用于用户表列。可以在列定义中使用 COLLATE 子句显式地指定列的排序规则,否则默认使用数据库的排序规则。通过 COLLATE 子句可以转换表达式的排序规则。
SELECT empid, firstname, lastname FROM HR.Employees WHERE lastname = N'davis' -- 不区分大小写
SELECT empid, firstname, lastname FROM HR.Employees WHERE lastname COLLATE Latin1_General_CS_AS = N'davis'