日期:2014-05-16  浏览次数:20776 次

关于sql server 中的排序规则的疑问
最近学习sql server 的时候发现在创建表的时候用到了“排序规则”。其实,究竟这个排序规则究竟有什么用途?加了排序规则与不加有什么区别?平常我用T_SQL语言建立基本表的时候都没用过“排序规则”!有哪位高手帮我讲解讲解!

最好加上实讲解,这样比较好理解!

[b]谢谢啦!![/
b]
------解决方案--------------------
利用排序规则解决特殊字符的查找问题
http://topic.csdn.net/u/20080317/17/55e464a2-f40a-43a8-9f94-21be297a52fb.html?1084261463

select CharIndex('_@_',N'RoleName_@_゛戀戰℡帝王') 
为什么这个输出不是9,而是0啊.而且 
select CharIndex('_@_',N'RoleName_@_戀戰℡帝王')这样就是正常的输出9,两种就是多了一个特殊字符而已啊 

-------------------------
select
    CharIndex('_@_',N'RoleName_@_゛戀戰℡帝王' COLLATE Chinese_PRC_BIN),
    CharIndex('_@_',N'RoleName_@_戀戰℡帝王' COLLATE Chinese_PRC_BIN)

select
    CharIndex('_@_',N'RoleName_@_゛戀戰℡帝王' COLLATE SQL_Latin1_General_CP437_BIN),
    CharIndex('_@_',N'RoleName_@_戀戰℡帝王' COLLATE SQL_Latin1_General_CP437_BIN)

--> 查找排序规则:
select top 1 * from ::fn_helpcollations() where name like '%BIN'


--> 二进制排序是区分大小写的:
select
    CharIndex('e_@_',N'RoleName_@_゛戀戰℡帝王' COLLATE Chinese_PRC_BIN),
    CharIndex('E_@_',N'RoleName_@_゛戀戰℡帝王' COLLATE Chinese_PRC_BIN)

--> 如果要不区分大小写:
select
    CharIndex('e_@_',N'RoleName_@_゛戀戰℡帝王' COLLATE Chinese_PRC_CI_AI),
    CharIndex('E_@_',N'RoleName_@_゛戀戰℡帝王' COLLATE Chinese_PRC_CI_AI)

--> 查找排序规则:
select top 1 * from ::fn_helpcollations() where name like '%CI%AI%'



在各种处理中应用排序规则的示例
--转自邹键

--1. 为数据库指定排序规则
CREATE DATABASE db COLLATE Chinese_PRC_CI_AS
GO

ALTER DATABASE db COLLATE Chinese_PRC_BIN
GO


/*====================================*/


--2. 为表中的列指定排序规则
CREATE TABLE tb(
col1 varchar(10),
col2 varchar(10) COLLATE Chinese_PRC_CI_AS)
GO

ALTER TABLE tb ADD col3 varchar(10) COLLATE Chinese_PRC_BIN
GO

ALTER TABLE tb ALTER COLUMN col2 varchar(10) COLLATE Chinese_PRC_BIN
GO


/*====================================*/


--3. 为字符变量和参数应用排序规则
DECLARE @a varchar(10),@b varchar(10)
SELECT @a='a',@b='A'

--使用排序规则 Chinese_PRC_CI_AS
SELECT CASE WHEN @a COLLATE Chinese_PRC_CI_AS = @b THEN '@a=@b' ELSE '@a<>@b' END
--结果:@a=@b

--使用排序规则 Chinese_PRC_BIN
SELECT CASE WHEN @a COLLATE Chinese_PRC_BIN = @b THEN '@a=@b' ELSE '@a<>@b' END
--结果:@a<>@b



排序规则在拼音处理中的应用

--1. 按拼音排序
DECLARE @t TABLE(col varchar(2))
INSERT @t SELECT '中'
UNION ALL SELECT '国'
UNION ALL SELECT '人'

SELECT * FROM @t ORDER BY col COLLATE Chinese_PRC_CS_AS_KS_WS
/*--结果
col  
---- 



--*/
GO


/*==========================================*/


--2. 汉字首字母查询处理用户定义函数
CREATE FUNCTION f_GetPY(@st