对于char、nchar、varchar、nvarchar类型的列,可以指定Windows或SQL排序规则。
--显示SQL Server实例的默认的排序规则 select SERVERPROPERTY('Collation') --显示:Chinese_PRC_CI_AS --显示数据库默认的排序规则 select DATABASEPROPERTYEX('master','Collation') --显示:Chinese_PRC_CI_AS --获取友好的信息,显示排序规则到底是什么意思 select description from sys.fn_helpcollations() where name = 'Chinese_PRC_CI_AS'
那么排序规则有什么应用?
create table test(v varchar(100) ) INSERT into test(v) values('你'), ('我'), ('他'), ('握'), ('喔') --1.查询排序规则的name select name,description from sys.fn_helpcollations() where name like '%Chinese_PRC%' --2.按照文字的拼音来排序,区分4个不同的声调 --2.1按照默认的排序规则排序:Chinese_PRC_CI_AS select * from test order by v --2.2按照Chinese_PRC_CS_AI排序,与默认的Chinese_PRC_CI_AS效果一样, --因为AI这里是不区分重音,而不是不区分声调 SELECT * FROM test ORDER BY v COLLATE Chinese_PRC_CS_AI --2.3按照二进制排序 select v,CAST(v as varbinary) from test order by v collate Chinese_PRC_BIN
注意,Chinese_PRC_CI_AS的描述Chinese-PRC, case-insensitive, accent-sensitive, kanatype-insensitive, width-insensitive。
create table tone ( --文字对应的拼音的第一个字母 v nvarchar(1), --音调的开始,如:喔,是第一声 tone_start nvarchar(1) COLLATE Chinese_PRC_CS_AS_KS_WS, --音调的结束,如:握,是第四声 tone_end nvarchar(1) COLLATE Chinese_PRC_CS_AS_KS_WS ) INSERT into tone(v,tone_start,tone_end) values('A',N'吖',N'鏊'), ('B',N'八',N'簿'), ('C',N'嚓',N'错'), ('D',N'哒',N'跺'), ('E',N'屙',N'贰'), ('F',N'发',N'馥'), ('G',N'旮',N'过'), ('H',N'铪',N'蠖'), ('J',N'丌',N'竣'), ('K',N'咔',N'廓'), ('L',N'垃',N'雒'), ('M',N'妈',N'穆'), ('N',N'拿',N'糯'), ('O',N'噢',N'沤'), ('P',N'趴',N'曝'), ('Q',N'七',N'群'), ('R',N'蚺',N'箬'), ('S',N'仨',N'锁'), ('T',N'他',N'箨'), ('W',N'哇',N'鋈'), ('X',N'夕',N'蕈'), ('Y',N'丫',N'蕴'), ('Z',N'匝',N'做') --返回文字拼音的第一个字母 select tone.v, --拼音的首字母 a.v, --文字 tone.tone_start, --拼音对应的第一声 tone.tone_end --拼音对应的第四声 from ( values('你'), ('我'), ('他'), ('握'), ('喔') )a(v) inner join tone on a.v >= tone.tone_start and a.v <= tone.tone_end
create table tone ( --文字对应的拼音的第一个字母 v nvarchar(10), --音调的开始,如:喔,是第一声 tone_start nvarchar(1) COLLATE Chinese_PRC_CS_AS_KS_WS, --音调的结束,如:握,是第四声 tone_end nvarchar(1) COLLATE Chinese_PRC_CS_AS_KS_WS ) --需要添加很多拼音和文字音调的对应关系 INSERT into tone(v,tone_start,tone_end) values('ni',N'妮',N'腻'), ('ta',N'他',N'踏'), ('wo',N'莴',N'握') --返回文字的拼音 select tone.v, --拼音的字母 a.v, --文字 tone.tone_start, --拼音对应的第一声 tone.tone_end --拼音对应的第四声 from ( values('你'), --返回:ni ('我'), --返回:wo ('他'), --返回:ta ('握'), --返回:wo ('喔') --返回:wo )a(v) inner join tone on a.v >= tone.tone_start and a.v <= tone.tone_end