失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > sql server 排序规则

sql server 排序规则

时间:2020-01-01 03:18:13

相关推荐

sql server 排序规则

为什么80%的码农都做不了架构师?>>>

/*

排序规则根据特定语言和区域设置的标准指定对 字符串 数据 进行排序和比较的规则。

以 ORDER BY 子句为例:如果按升序排列,说英语的人认为字符串 Chiapas 应排在 Colima 之前。

但是,对于在墨西哥说西班牙语的人来说,他们会认为以 Ch 开头的单词应显示在以 C 开头的单词列表的末尾。

排序规则规定了这些排序和比较规则。Latin_1 General 排序规则在 ORDER BY ASC 子句中将 Chiapas 排在 Colima 之前,

而 Traditional_Spanish 排序规则将 Chiapas 排在 Colima 之后。

排序规则名称由两部份构成,前半部份是指本排序规则所支持的字符集。

如:

Chinese_PRC_CS_AI_WS

前半部份:指UNICODE字符集,Chinese_PRC_指针对大陆简体字UNICODE的排序规则。

排序规则的后半部份即后缀 含义:

_BIN 二进制排序

_CI(CS) 是否区分大小写,CI不区分,CS区分

_AI(AS) 是否区分重音,AI不区分,AS区分

_KI(KS) 是否区分假名类型,KI不区分,KS区分

_WI(WS) 是否区分宽度 WI不区分,WS区分

区分大小写:如果想让比较将大写字母和小写字母视为不等,请选择该选项。

区分重音:如果想让比较将重音和非重音字母视为不等,请选择该选项。如果选择该选项,比较还将重音不同的字母视为不等。

区分假名:如果想让比较将片假名和平假名日语音节视为不等,请选择该选项。

区分宽度:如果想让比较将半角字符和全角字符视为不等,请选择该选项。

修改排序规则

如果是数据库:ALTER DATABASE 数据库名 COLLATE 排列规则

ALTER DATABASE test COLLATE Chinese_PRC_CI_AI

如果是表中的字段:ALTER TABLE 表名 ALTER COLUMN 字段名 数据类型(长度) COLLATE 排列规则

ALTER TABLE test ALTER COLUMN name varchar(10) COLLATE Chinese_PRC_CI_AI

*/

--所有排序规则

SELECT * FROM :: FN_HELPCOLLATIONS()

-----------------------------------------------------------------------------------

--1.为数据库指定排序规则

CREATE DATABASE test1 COLLATE Chinese_PRC_CI_AS

GO

CREATE DATABASE test2 COLLATE Chinese_Hong_Kong_Stroke_90_CI_AI

GO

USE test1

go

CREATE TABLE a

(

col1 VARCHAR(10) ,

col2 VARCHAR(10)

)

INSERT INTO a

SELECT 'a1' , 'a2'

UNION ALL

SELECT 'a3' , 'a4'

GO

---------------

USE test2

go

CREATE TABLE a

(

col1 VARCHAR(10) ,

col2 VARCHAR(10)

)

GO

INSERT INTO a

SELECT 'a1' , 'a2'

UNION ALL

SELECT 'a5' , 'a6'

-----------------

SELECT * FROM test1.dbo.a

SELECT * FROM test2.dbo.a

--转换规则,语句执行无错

SELECT * FROM test1.dbo.a aa , test2.dbo.a bb

WHERE aa.col1 = bb.col1 COLLATE Chinese_PRC_CI_AS

SELECT * FROM test1.dbo.a aa , test2.dbo.a bb

WHERE aa.col1 = bb.col1 --这句单独执行,出错 ,无法解决 equal to 操作中 "Chinese_Hong_Kong_Stroke_90_CI_AI" 和 "Chinese_PRC_CI_AS" 之间的排序规则冲突。

--排序规则不一样,无法比较字符串 ,字段,需要转换规则.使其一致,好比2个人做比较,谁厉害点,指定一个规则,如这2个人sql方面做比较

USE master

go

DROP DATABASE test1

go

DROP DATABASE test2

-----------------------------------------------------------------------------------

--2.为表中的列指定排序规则

CREATE TABLE #t1

(

col1 VARCHAR(10) ,

col2 VARCHAR(10) COLLATE Chinese_PRC_CI_AS

)

GO

INSERT INTO #t1

SELECT 'a1' ,'a2'

UNION ALL

SELECT 'a3' ,'a4'

CREATE TABLE #t2

(

col1 VARCHAR(10) ,

col2 VARCHAR(10) COLLATE Chinese_Hong_Kong_Stroke_90_CI_AI

)

GO

INSERT INTO #t2

SELECT 'a1' ,'a2'

UNION ALL

SELECT 'a3' ,'a4'

SELECT * FROM #t1

SELECT * FROM #t2

--没错误

SELECT * FROM #t1 aa JOIN #t2 bb ON aa.col1 = bb.col1

--转换规则

SELECT * FROM #t1 aa , #t2 bb WHERE aa.col2 = bb.col2 COLLATE Chinese_PRC_CI_AS

SELECT *

FROM #t1 JOIN #t2 ON #t1.col2 = #t2.col2 --出错,无法解决 equal to 操作中 "Chinese_Hong_Kong_Stroke_90_CI_AI" 和 "Chinese_PRC_CI_AS" 之间的排序规则冲突。

DROP TABLE #t1

DROP TABLE #t2

-----------------------------------------------------------------------------------

--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

SELECT @a

SELECT @b

--按笔画姓氏查询

SELECT * FROM TableName ORDER BY CustomerName COLLATE Chinese_PRC_Stroke_ci_as

-----------------------------------------------------------------------------------

原文地址:/qanholas/archive//09/16/1828163.html

如果觉得《sql server 排序规则》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。