select * from :: fn_helpcollations(); 啥意思,讲下
这是一个非常有用的系统函数,用来查看 SQL Server 支持的所有排序规则。
直接拆解:
整体语法
sql
SELECT * FROM ::fn_helpcollations();
| 部分 | 含义 |
|---|---|
SELECT * | 查看所有列(通常有:名称、描述) |
FROM | 从...获取数据 |
:: | 调用表值函数的语法(两个冒号是 SQL Server 特有的) |
fn_helpcollations | 系统内置的表值函数,返回排序规则列表 |
() | 函数调用(虽然没参数,但括号要写) |
这个函数的作用
返回 SQL Server 实例支持的所有排序规则的列表。
执行结果大概长这样:
| name | description |
|---|---|
| Chinese_PRC_CI_AS | Chinese-PRC, case-insensitive, accent-sensitive, ... |
| Chinese_PRC_CS_AS | Chinese-PRC, case-sensitive, accent-sensitive, ... |
| SQL_Latin1_General_CP1_CI_AS | Latin1-General, case-insensitive, ... |
| Albanian_CI_AI_WS | Albanian, case-insensitive, accent-insensitive, width-sensitive |
| ... | ... |
通常有 几千行(不同版本数量不同)。
为什么有两个冒号 ::
SQL Server 中有几种不同的函数:
语法 | 类型 | 例子 |
dbo.func() | 普通标量函数 | SELECT dbo.GetName() |
SELECT * FROM func() | 表值函数(常规) | SELECT * FROM tvf() |
SELECT * FROM ::fn_helpcollations() | 系统表值函数 | 系统级,用 :: 调用 |
:: 是 SQL Server 用来调用系统表值函数的特殊语法,表示“这是服务器自带的函数,不在任何用户数据库中”。
类似的系统函数还有:
sql
SELECT * FROM ::fn_dblog() -- 查看事务日志SELECT * FROM ::fn_get_audit_file() -- 查看审计文件
实际用法
1. 查看所有排序规则
sql
SELECT * FROM ::fn_helpcollations();
2. 查找中文相关的排序规则
sql
SELECT * FROM ::fn_helpcollations()WHERE name LIKE '%Chinese%';
结果:
| name | description |
|---|---|
| Chinese_PRC_CI_AS | Chinese-PRC, case-insensitive... |
| Chinese_PRC_CS_AS | Chinese-PRC, case-sensitive... |
| Chinese_Taiwan_CI_AS | Chinese-Taiwan... |
| Chinese_Hong_Kong_CI_AS | Chinese-Hong Kong... |
3. 查找不区分大小写的规则
sql
SELECT * FROM ::fn_helpcollations()WHERE name LIKE '%_CI_%';
4. 查找特定语言的规则
sql
SELECT * FROM ::fn_helpcollations()WHERE description LIKE '%Albanian%';
关键知识点
排序规则命名规律
所有排序规则名字都遵循这个模式:
text
[语言]_[地区]_[大小写]_[重音]_[宽度可选]_[可选特性]
以 Chinese_PRC_CI_AS 为例:
| 部分 | 含义 |
|---|---|
Chinese | 语言(中文) |
PRC | 地区(中国大陆) |
CI | Case-Insensitive(不区分大小写) |
AS | Accent-Sensitive(区分重音) |
常见的后缀组合:
| 后缀 | 含义 |
|---|---|
_CI_AS | 不区分大小写,区分重音(最常用) |
_CS_AS | 区分大小写,区分重音 |
_CI_AI | 不区分大小写,不区分重音 |
_CS_AI | 区分大小写,不区分重音 |
_CI_AS_WS | 再加上区分全角/半角 |
_BIN | 二进制排序(最快,但不符合人类习惯) |
和之前代码的联系
之前你看到的:
sql
name varchar(50) COLLATE Chinese_PRC_CI_AS NULL
这个 Chinese_PRC_CI_AS 就是 ::fn_helpcollations() 返回结果中的其中一行。
你可以验证:
sql
-- 查看 Chinese_PRC_CI_AS 是否存在(肯定存在)SELECT * FROM ::fn_helpcollations()WHERE name = 'Chinese_PRC_CI_AS';
注意事项
| 注意点 | 说明 |
|---|---|
| 只读函数 | 只查看,不修改任何东西 |
| 不同版本结果不同 | SQL Server 2008 / 2012 / 2019 / 2022 返回的排序规则数量不一样 |
| 数据库级别也有排序规则 | 这个函数显示的是服务器级别支持的,不一定是当前数据库用的 |
:: 不能省略 | 写成 SELECT * FROM fn_helpcollations() 会报错 |
总结
| 问题 | 答案 |
|---|---|
| 这是什么? | 系统表值函数,列出所有可用排序规则 |
为什么用 :: | SQL Server 调用系统表值函数的特殊语法 |
| 什么时候用? | 不确定某个排序规则名字对不对时,查一下 |
| 常见用途 | WHERE name LIKE '%Chinese%' 找到中文相关规则 |
一句话:这是 SQL Server 的“排序规则字典”,你想知道有哪些排序规则可用,就执行它