您好!欢迎访问家园网-www.jy.wang!

家园网

select * from :: fn_helpcollations(); 啥意思,讲下

网络 作者:本站 点击:

select * from :: fn_helpcollations(); 啥意思,讲下


这是一个非常有用的系统函数,用来查看 SQL Server 支持的所有排序规则。

直接拆解:


整体语法

sql

SELECT * FROM ::fn_helpcollations();

部分含义
SELECT *查看所有列(通常有:名称、描述)
FROM从...获取数据
::调用表值函数的语法(两个冒号是 SQL Server 特有的)
fn_helpcollations系统内置的表值函数,返回排序规则列表
()函数调用(虽然没参数,但括号要写)

这个函数的作用

返回 SQL Server 实例支持的所有排序规则的列表。

执行结果大概长这样:

namedescription
Chinese_PRC_CI_ASChinese-PRC, case-insensitive, accent-sensitive, ...
Chinese_PRC_CS_ASChinese-PRC, case-sensitive, accent-sensitive, ...
SQL_Latin1_General_CP1_CI_ASLatin1-General, case-insensitive, ...
Albanian_CI_AI_WSAlbanian, 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%';

结果:

namedescription
Chinese_PRC_CI_ASChinese-PRC, case-insensitive...
Chinese_PRC_CS_ASChinese-PRC, case-sensitive...
Chinese_Taiwan_CI_ASChinese-Taiwan...
Chinese_Hong_Kong_CI_ASChinese-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地区(中国大陆)
CICase-Insensitive(不区分大小写)
ASAccent-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 的“排序规则字典”,你想知道有哪些排序规则可用,就执行它


标签: