COLLATIONPROPERTY函数返回指定排序规则的属性值,如CodePage、LCID、Version和ComparisonStyle;它仅接受排序规则名称和属性名两个字符串参数,用于查询元信息而非控制比较行为。

COLLATIONPROPERTY 函数返回什么?
COLLATIONPROPERTY 不是检查“数据库的排序规则”,而是检查某个具体排序规则名称的属性。它本身不接受数据库名或列名,只接受两个参数:排序规则名称(字符串)和属性名(字符串)。常见用法是配合 DATABASEPROPERTYEX(db_name, 'Collation') 或系统视图先拿到排序规则名,再传给 COLLATIONPROPERTY。
常见错误现象:COLLATIONPROPERTY('Chinese_PRC_CI_AS', 'Version') 返回 NULL —— 这通常是因为拼写错误(比如漏掉下划线、大小写不敏感但 SQL Server 对排序规则名严格区分大小写?实际不区分,但必须完全匹配内置名称),或属性名写错(如写成 'version' 而不是 'Version')。
- 属性名必须首字母大写:可用值包括
'CodePage'、'LCID'、'Version'、'ComparisonStyle' - 排序规则名必须是 SQL Server 实际支持的名称,不能是别名或自定义拼写
- 返回值类型为
sql_variant,在 SELECT 中直接使用通常自动转为int或varchar,但参与计算前建议显式转换
怎么查当前数据库排序规则并获取其 CodePage?
先用 DATABASEPROPERTYEX 拿到当前数据库的排序规则名,再喂给 COLLATIONPROPERTY:
SELECT DATABASEPROPERTYEX(DB_NAME(), 'Collation') AS DatabaseCollation, COLLATIONPROPERTY(DATABASEPROPERTYEX(DB_NAME(), 'Collation'), 'CodePage') AS CodePage, COLLATIONPROPERTY(DATABASEPROPERTYEX(DB_NAME(), 'Collation'), 'LCID') AS LCID;
注意点:
-
DB_NAME()在用户数据库上下文中才有效;若在master中执行,查的是master的排序规则 - 如果数据库使用
SQL_Latin1_General_CP1_CI_AS,CodePage返回1252;若为Chinese_PRC_CI_AS,则返回936 -
COLLATIONPROPERTY对排序规则名大小写不敏感,但推荐按官方文档写法(全大写或 PascalCase 均可,如Latin1_General_CI_AS)
为什么在 WHERE 或 JOIN 中不能直接用 COLLATIONPROPERTY?
COLLATIONPROPERTY 是标量函数,只能用于表达式上下文,比如 SELECT 列表、WHERE 中的常量比较,不能用于影响排序行为本身。它不改变字段的排序规则,也不参与字符比较逻辑。
容易踩的坑:
- 误以为
WHERE COLLATIONPROPERTY(col COLLATE Latin1_General_BIN, 'Version') = 2能让查询按二进制排序 —— 实际上COLLATE才控制比较行为,COLLATIONPROPERTY只是“读取元信息” - 在索引表达式或计算列中调用它会导致无法持久化(因为函数非确定性)
- 它不接受列名作为第一个参数,只接受字符串字面量或变量(如
@collation_name)
正确场景举例:
- 部署脚本中校验目标数据库排序规则是否支持某字符集(通过
CodePage判断是否为936或65001) - 动态生成建表语句时,根据当前排序规则决定是否启用特定约束
COLLATIONPROPERTY 的 Version 值代表什么?
Version 返回一个整数,表示该排序规则的内部版本号,与 SQL Server 版本号无关。例如:
-
SQL_Latin1_General_CP1_CI_AS在 SQL Server 2019 和 2022 中都返回0 - 新式排序规则如
Latin1_General_100_CI_AS_SC_UTF8返回100
关键点:
-
Version = 0表示传统排序规则(基于 Windows LCID) -
Version >= 100表示“100 系列”排序规则(支持补充字符、Unicode 校对更精确) -
UTF8后缀的排序规则一定对应Version >= 100,但反过来不成立(Version = 100不一定支持 UTF-8 存储) - 这个值不能用来判断 SQL Server 大版本,仅反映排序规则设计代际
真正影响行为的是排序规则名本身,而不是 COLLATIONPROPERTY 返回的数字。很多人查了 Version 就以为搞懂了排序规则兼容性,其实还得看是否带 _SC、_UTF8、_BIN2 等后缀。

















