zoukankan      html  css  js  c++  java
  • 处理字符数据排序规则(Collation)

      排序规则是字符数据的一个属性,封装了几个方面的特性,包括多语言支持(和Unicode类型有关,因为它支持所有语言)、排序规则、区分大小写、区分重音,等等。要得到系统中目前支持的所有排序规则极其描述,可以查询表函数fn_helpcollations,如下所示:

    1 SELECT name,description
    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子句也可以修改表达式的排序规则。例如,在不区分大小写的环境中,以下查询使用的是不区分大小写的比较:

    1 SELECT empid,firstname,lastname
    2 FROM HR.Employees
    3 WHERE lastname=N'davis';

      该查询会返回与Sara Davis关联的数据行,显然大小写并不匹配,因为查询效果就是不区分大小写的。

      如果想在列的排序规则是不区分大小写的前提下,让过滤条件是区分大小写的,则可以按如下所示的方法来修改表达式的排序规则:

    1 SELECT empid,firstname,lastname
    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])。

  • 相关阅读:
    OCM_Session1_2_Server-side Network Configuration
    sql union代替or
    创建组合索引SQL从1个多小时到1S的案例
    OCM_session0手动建库实验
    慎用位图索引
    Java之List排序
    Java之List排序出错
    dojo、iframe和FusionCharts兼容性
    Java之indexOf()方法
    Java之split()方法
  • 原文地址:https://www.cnblogs.com/ShaYeBlog/p/2701258.html
Copyright © 2011-2022 走看看