SQL 中文排序方式

这篇博客介绍了SQL中如何实现中文排序,包括在建表和查询语句中进行相应修改的方法,详细解析了SQL排序的原理。

SQL排序原理:

排序规则名称由两部份构成,前半部份是指本排序规则所支持的字符集。
如:
  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区分区分宽度:如果想让比较将半角字符和全角字符视为不等,请选择该选项

如何根据中文进行排序:

1、修改建表语句:

CREATE TABLE [dbo].[MODULE_TYPE](
            [ID] [varchar](15) COLLATE Chinese_PRC_CI_AS NOT NULL,
            [PARENT_ID] [varchar](15) COLLATE Chinese_PRC_CI_AS NULL,
            [NAME] [varchar](40) COLLATE Chinese_PRC_CI_AS NOT NULL,
            [REMARK] [varchar](200) COLLATE Chinese_PRC_CI_AS NULL,
            [ORDER_ID] [int] NOT NULL,
         CONSTRAINT [PK_PB_MODULE_TYPE] PRIMARY KEY NONCLUSTERED 
        (
            [ID] ASC
        )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
        ) ON [PRIMARY]

2.修改查询语句: 

城市按拼音排序:
SELECT chineseName FROM [表名] order by chinesename collate Chinese_PRC_CS_AS_KS_WS asc
城市按笔划排序:
SELECT chineseName FROM [表名] order by chinesename collate Chinese_PRC_Stroke_CS_AS_KS_WS   asc

  

转载于:https://www.cnblogs.com/wzh13681626019/archive/2013/01/16/2862808.html

<think>嗯,用户想在SQL Server中对包含中英文的字段进行排序,先显示英文再显示中文。我需要根据提供的引用资料来找到解决方法。首先,我记得排序规则(COLLATE)可以影响排序方式。引用[3]里提到可以通过指定排序规则来改变查询结果的顺序,例如使用Latin1_General_BIN区分大小写。但用户需要的是区分中英文,而不仅仅是大小写。 引用[2]中提到,可以通过自定义排序规则来处理中英文混合的情况。例如,判断字段的首字符是否为英文字母,然后根据不同的情况赋予不同的排序值。比如,使用CASE语句,当首字符是英文字母时,排序优先级设为0,否则设为1,然后按这个优先级和字段本身排序。这样英文会排在中文前面。 另外,引用[5]提到使用REPLACE函数去除换行符,可能影响排序结果。所以在处理字段时需要确保数据干净,没有隐藏字符影响判断。 还需要考虑字段开头是否为英文字母,可能需要用ASCII码来判断。例如,ASCII码在65-90和97-122之间的是字母。可以用SUBSTRING和UNICODE函数提取首字符并判断。 综合这些思路,应该可以写出一个SQL查询,先根据首字符是否为英文进行排序,再按字段本身排序。同时,可能需要使用特定的排序规则,如Chinese_PRC_CI_AS来处理中文拼音排序。这样就能实现先英文后中文的效果了。</think>### SQL Server中英文字段排序实现方式(先英文后中文) #### **方法一:使用CASE语句+ASCII码判断** 通过判断字段首字符是否为英文字母(ASCII码范围),赋予不同的排序优先级: ```sql SELECT columnname FROM yourtable ORDER BY CASE WHEN UNICODE(SUBSTRING(columnname,1,1)) BETWEEN 65 AND 90 -- A-Z OR UNICODE(SUBSTRING(columnname,1,1)) BETWEEN 97 AND 122 -- a-z THEN 0 ELSE 1 END, columnname COLLATE Chinese_PRC_CI_AS ``` #### **方法二:自定义排序标记(推荐复杂场景)** 增加辅助列标记语言类型,按标记和字段联合排序: ```sql -- 添加计算列 ALTER TABLE yourtable ADD SortPriority AS CASE WHEN UNICODE(LEFT(columnname,1)) BETWEEN 65 AND 122 THEN 0 ELSE 1 END PERSISTED -- 查询排序 SELECT columnname FROM yourtable ORDER BY SortPriority, columnname COLLATE Latin1_General_CI_AS ``` #### **方法三:COLLATE强制二进制排序** 通过二进制排序规则区分字符类型: ```sql SELECT columnname FROM yourtable ORDER BY CASE WHEN columnname COLLATE Latin1_General_BIN LIKE '[a-zA-Z]%' THEN 0 ELSE 1 END, columnname COLLATE Chinese_PRC_CI_AS ``` #### **关键点说明** 1. **ASCII码范围判断**:英文首字母的ASCII码范围是A-Z(65-90)、a-z(97-122)[^3] 2. **COLLATE选择**:`Chinese_PRC_CI_AS`支持中文拼音排序,`Latin1_General_BIN`提供精确字符识别[^4] 3. **性能优化**:建议为`SortPriority`计算列建立索引[^2] #### **特殊字符处理** 若字段包含空格/换行符,需先清理数据: ```sql REPLACE(REPLACE(columnname, CHAR(13), ''), CHAR(10), '') -- 去除换行符[^5] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值