关于SQL SERVER排序规则

 

一、排序规则简介:

什么叫排序规则呢?MS是这样描述的:"在 Microsoft SQL Server  中,
字符串的物理存储由排序规则控制。排序规则指定表示每个字符的位模式以及存
储和比较字符所使用的规则。"
  在查询分析器内执行下面语句,可以得到SQL SERVER支持的所有排序规则。
    select * from ::fn_helpcollations()
排序规则名称由两部份构成,前半部份是指本排序规则所支持的字符集。
如:
  Chinese_PRC_CS_AI_WS
前半部份:指UNICODE字符集,Chinese_PRC_指针对大陆简体字UNICODE的排序规则,按拼音排序。
Chinese_PRC_Stroke 表示按汉字笔画排序;
排序规则的后半部份即后缀 含义:
  _BIN 二进制排序
  _CI(CS) 是否区分大小写,CI不区分,CS区分(case-insensitive/case-sensitive)
  _AI(AS) 是否区分重音,AI不区分,AS区分(accent-insensitive/accent-sensitive)
  _KI(KS) 是否区分假名类型,KI不区分,KS区分(kanatype-insensitive/kanatype-sensitive)
  _WI(WS) 是否区分宽度 WI不区分,WS区分(width-insensitive/width-sensitive) 
区分大小写:如果想让比较将大写字母和小写字母视为不等,请选择该选项。
区分重音:如果想让比较将重音和非重音字母视为不等,请选择该选项。如果选择该选项,
比较还将重音不同的字母视为不等。
区分假名:如果想让比较将片假名和平假名日语音节视为不等,请选择该选项。
区分宽度:如果想让比较将半角字符和全角字符视为不等,请选择该选项。


二、修改、查看排序规则:

------修改列的排序规则
ALTER TABLE tb
ALTER COLUMN colname nvarchar(100) COLLATE Chinese_PRC_CI_AS

------修改数据库的排序规则
ALTER DATABASE database
COLLATE Chinese_PRC_CS_AS

------查看某个表的排序规则
select collation from syscolumns
where id=object_id(N'yourtablename')

五、排序规则应用:

  SQL SERVER提供了大量的WINDOWS和SQLSERVER专用的排序规则,但它的应用往往
被开发人员所忽略。其实它在实践中大有用处。

  例1:让表NAME列的内容按拼音排序:

create table #t(id int,name varchar(20))
insert #t select 1,'中'
union all select 2,'国'
union all select 3,'人'
union all select 4,'阿'

select * from #t order by name collate Chinese_PRC_CS_AS_KS_WS
drop table #t
/*结果:
id          name                
----------- --------------------
4           阿
2           国
3           人
1           中
*/

  例2:让表NAME列的内容按姓氏笔划排序:

create table #t(id int,name varchar(20))

insert #t select 1,'三'
union all select 2,'乙'
union all select 3,'二'
union all select 4,'一'
union all select 5,'十'
select * from #t order by name collate Chinese_PRC_Stroke_CS_AS_KS_WS 
drop table #t
/*结果:
id          name                
----------- --------------------
4           一
2           乙
3           二
5           十
1           三
*/

 

 

三、常见问题处理:

 1.“无法解决 equal to 操作的排序规则冲突。”

示例1:

create table #t1(
name varchar(20) collate Albanian_CI_AI_WS, 
value int)

create table #t2(
name varchar(20) collate Chinese_PRC_CI_AI_WS,   
value int )

表建好后,执行连接查询:

select * from #t1 A inner join #t2 B on A.name=B.name

这样,错误就出现了:

           服务器: 消息 446,级别 16,状态 9,行 1
           无法解决 equal to 操作的排序规则冲突。
  要排除这个错误,最简单方法是,表连接时指定它的排序规则,这样错误就
不再出现了。语句这样写:

select *
from #t1 A inner join #t2 B
on A.name=B.name collate Chinese_PRC_CI_AI_WS

示例2:

例如,在创建表时考虑使用下面的 Transact-SQL 语句:

CREATE TABLE TestTab (

id int,

GreekCol nvarchar(10) COLLATE greek_ci_as,

LatinCol nvarchar(10) COLLATE latin1_general_cs_as

)

INSERT TestTab VALUES (1, N'A', N'a')

GO

该语句创建了一个包含以下两列的表:一列使用不区分大小写和区分重音的希腊语排序规则,而另一列使用区分大小写和重音的通用 Latin1 排序规则。

您可以尝试使用查询来显式比较这两列:

SELECT *

FROM TestTab

WHERE GreekCol = LatinCol

但是,该查询会返回一个错误:

Msg 446, Level 16, State 9, Server V-MICHKA3, Line 1

无法解决等于运算的排序规则冲突。

之所以会出现此错误,是因为服务器无法使用不同的排序规则来比较两段文本。但是,如果您使用 COLLATE 关键字显式创建一个允许这两列兼容的表达式,则查询将以如下方式执行:

SELECT *

FROM TestTab

WHERE GreekCol = LatinCol COLLATE greek_ci_as

还需注意的是,尽管 LatinCol 通常有一个区分大小写的排序规则,但表达式不区分大小写的排序规则会将其覆盖,从而使“A”的大写和小写被视为等同。

 

 

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SQL Server排序规则是用于指定数据库中字符数据的排序方式。在安装SQL Server数据库时,默认的排序规则是根据系统区域设置自动生成的。例如,在Windows服务器系统区域设置为英语(美国)时,默认安装的排序规则SQL_Latin1_General_CP1_CI_AS。如果需要修改排序规则,可以按照以下步骤进行操作: 1. 修改表达式排序规则:在SQL查询时,默认排序规则无法覆盖,但可以在查询表达式中指定排序规则进行转换查询。 2. 修改列级排序规则:可以针对特定的列修改排序规则。这可以通过修改列的数据类型或使用ALTER TABLE语句来实现。 3. 修改数据库级排序规则:如果需要修改整个数据库的排序规则,可以使用ALTER DATABASE语句来更改。在执行ALTER DATABASE之前,需要中断所有对该数据库的访问。 要查看系统中支持的全部排序规则列表,可以使用以下查询: SELECT * FROM ::fn_helpcollations() 要查看当前系统的排序规则,可以使用以下查询: SELECT SERVERPROPERTY('Collation') 要修改数据库的排序规则,可以使用以下语法: ALTER DATABASE 数据库名 COLLATE 排序规则名 例如,要将数据库的排序规则修改为区分大小写的简体中文排序规则(Chinese_PRC_CS_AS),可以使用以下语句: ALTER DATABASE test COLLATE Chinese_PRC_CS_AS 请注意,在执行ALTER DATABASE之前,需要中断所有对该数据库的访问。 #### 引用[.reference_title] - *1* *2* [SQL sever 排序规则介绍](https://blog.csdn.net/li_jerry/article/details/124845305)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [SQL Server 排序规则](https://blog.csdn.net/E_eric/article/details/9260643)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值