SQL排序规则怎么设置_关键概念讲透让学习更加顺畅【技巧】

3次阅读

sql排序规则(Collation)决定字符比较和排序的底层逻辑,影响大小写、重音敏感性及中文排序方式,可在列级、表达式级、数据库 级和服务器级设置,高优先级覆盖低优先级。

SQL 排序规则怎么设置_关键概念讲透让学习更加顺畅【技巧】

SQL 排序规则(Collation)不是 ORDER BY 本身,而是决定“怎么比大小”的底层设定。它影响字符比较、排序顺序、是否区分大小写和重音——这些在你用 ORDER BY 时悄悄起作用,但很多人直到排序结果“不对劲”才意识到问题出在这儿。

排序规则到底管什么

它不控制你写不写 DESC,也不决定先排哪个字段。它管的是:

  • 字母 A 和 a 算不算相等(大小写敏感:CI vs CS)
  • café和 cafe 排在一起还是分开(重音敏感:ai vs AS)
  • 中文按拼音、笔画还是 Unicode 码点排(如 Chinese_PRC_CI_AS vs Latin1_General_CI_AS)
  • 同一个查询,在不同服务器上 ORDER BY ‘apple’ 和 ’apple’ 谁在前,可能结果相反

在哪一级可以设置

排序规则可设在四个层级,优先级从高到低:

  • 列级:建表时指定,最精准。例:name VARCHAR(50) COLLATE Chinese_PRC_CI_AS
  • 表达式级 :查询中临时覆盖,用COLLATE 关键字。例:ORDER BY username COLLATE SQL_Latin1_General_CP1_CI_AS
  • 数据库级:创建 DB 时指定,默认影响所有新列(除非显式覆盖)
  • 服务器级:安装 SQL Server 时定下,是整个实例的兜底规则

注意:高优先级会覆盖低优先级。比如某列设了 CS(区分大小写),即使数据库是 CI(不区分),该列仍按 CS 比对。

常见排序规则命名含义

Chinese_PRC_CI_AS 为例拆解:

  • Chinese_PRC:语言区域(中国大陆中文)
  • CI:Case Insensitive(不区分大小写)
  • AS:Accent Sensitive(区分重音)

再比如 SQL_Latin1_General_CP1_CI_AS,CP1 代表代码页 1252,适合西欧字符;而Latin1_General_100_CI_AS_SC_UTF8 支持 UTF- 8 且带补充字符(SC)支持。选错可能导致中文乱序、emoji 无法比较等问题。

什么时候要特别注意

以下情况容易暴露排序规则问题:

  • 跨库 JOIN 或 union 时提示“无法解析排序规则冲突”
  • ORDER BY 中文字段,结果不是按拼音顺序(比如“北京”排在“上海”后面)
  • WHERE name = ‘Tom’ 查不到 ’tom’,但明明设了 CI——可能列级用了 CS
  • 同一 SQL 在 开发环境 正常,上线后排序颠倒(服务器默认规则不同)

查当前列的排序规则,可用:select collation_name FROM sys.columns WHERE object_id = OBJECT_ID('表名') AND name = '列名';

基本上就这些。排序规则不是每次写 ORDER BY 都要调,但一旦遇上字符排序异常,它就是根因。理解它,比死记语法更能避开大坑。

站长
版权声明:本站原创文章,由 站长 2025-12-23发表,共计1221字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
1a44ec70fbfb7ca70432d56d3e5ef742
text=ZqhQzanResources