处理字符数据--排序规则(Collation)
排序规则是字符数据的一个属性,封装了几个方面的特性,包括多语言支持(和Unicode类型有关,因为它支持所有语言)、排序规则、区分大小写、区分重音,等等。要得到系统中目前支持的所有排序规则极其描述,可以查询表函数fn_helpcollations,如下所示:
2 FROM sys.fn_helpcollations();
例如,排序规则Latin1_General_CI_AS表示:
- Latin1_General 支持的语言是英语。
- 字典排序 基于字典顺序对字符数据进行排序和比较('A'和'a'<'B'和'b')。这一排序规则之所以采用字典顺序,是因为当没有显示地定义任何排序规则时,就默认使用字典顺序(更确切地说,排序规则名称中没有显示地出现BIN元素)。如果出现了BIN元素,就表示要根据字符的二进制表示对字符数据进行排序和比较('A'<'B'<'a'<'b')。
- CI 数据不区分大小写('a'='A')。
- AS 数据区分重音。
可以在4中不同的级别上定义排序规则:SQL Server实例、数据库、列、以及表达式。最低的排序规则是比较有效的一种定义方式。
SQL Server实例的排序规则是在安装时设置的。它决定了所有系统数据库的排序规则,同时也是用户数据库默认使用的排序规则。
当创建用户数据库时,可以使用COLLATE子句指定数据库的排序规则。如果不指定,则默认采用SQL Server实例的排序规则。
数据库的排序规则决定了数据库中对象数据的排序规则,同时也是用户表列默认使用的排序规则。要重点强调的是,数据库的排序规则决定了元数据(包括对象和列名称)的排序规则。例如,如果数据库的排序规则是不区分大小写的,那么在同一架构内就不能同时创建两个名为T1和t1的表;但如果数据库的排序规则是区分大小写的,则可以创建这样的两个表。
在定义列时,可以用COLLATE子句显示地指定它的排序规则。如果不指定,则默认使用数据库的排序规则。
用COLLATE子句也可以修改表达式的排序规则。例如,在不区分大小写的环境中,以下查询使用的是不区分大小写的比较:
2 FROM HR.Employees
3 WHERE lastname=N'davis';
该查询会返回与Sara Davis关联的数据行,显然大小写并不匹配,因为查询效果就是不区分大小写的。
如果想在列的排序规则是不区分大小写的前提下,让过滤条件是区分大小写的,则可以按如下所示的方法来修改表达式的排序规则:
2 FROM HR.Employees
3 WHERE lastname COLLATE Latin1_General_CS_AS = N'davis';
这次,查询将返回一个空的结果集,因为当前使用区分大小写的比较时,没有找到任何匹配的信息。
引号分割的标识符
在标准的SQL中,单引号用于分割文字字符串(例如,'literal'),而双引号用于分割不规则的标识符(表名或列名包含空格或以数字作为开始,例如,"Irregular Identifier")。在SQL Server中,有一个名为QUOTED_IDENTIFIER的设置选项,用于控制双引号的含义。可以在数据库级应用这个设置选项(用ALTER DATABASE命令),也可以在会话级应用这个设置选项(用SET命令)。当打开这个设置时,其行为符合标准SQL的规定,双引号仅用于分割标识符。当关闭这个设置时,其行为就不是标准的了,双引号这时也可以用于分割文字字符串。在此强烈建议遵循最佳实践,坚持使用标准行为(将这个选项设置为ON)。大多数数据库接口(包括OLEDB和ODBC)都默认将这个选项设置为ON。
单引号(')用于分割文字字符串,如果单引号是文字字符串的一部分,则需要由两个单一号('')表示。例如,要表示文字字符串abc'de,应该写成'abc''de'。
提示:除了用双引号分割标识符以外,SQL Server也支持用方括号作为分隔符(例如,[Irregular Identifier])。