数据库技术动态 — IBM 近日发布了 DB2 for Linux, UNIX, and Windows (LUW) 版本 11.5.9 的维护更新。本次更新除了常规的故障修复和安全性增强外,一个值得开发者与 DBA 关注的功能改进是 COLLATION_KEY() 函数 所支持的排序规则名称(Collation names)的明确化和扩展。不少用户在升级后反馈,调用该函数时不清楚应使用哪些合法的排序规则名称,本文就此进行系统梳理。
何为 COLLATION_KEY() 函数?
COLLATION_KEY() 是 DB2 中用于生成字符串排序键的内置函数,其核心语法为:
COLLATION_KEY( string_expression, collation_name )
该函数根据第二个参数指定的排序规则,为输入字符串计算一个二进制排序键。这个键可用于自定义排序、分组或索引加速,尤其在多语言环境下,不同地区对字符排序规则的要求各不相同。例如,德语中“ß”应排在“ss”附近,而法语中带重音的字母排序规则也有特殊逻辑。
v11.5.9 中的排序规则名称变化
在早期版本中,用户可以输入类似 UCA400R1_LDE 这样的内部名称,但缺乏可查阅的清单。v11.5.9 新增了一套更规范的 排序规则标识符命名规则,并在官方文档中明确列出了所有支持的合法字符串。
根据 IBM 技术说明(Technote 7060152),DB2 LUW v11.5.9 支持的排序规则名称可分为以下几类:
1. 系统级排序规则(System Collations)
以 SYSTEM_ 开头,代表当前操作系统区域(Locale)对应的排序规则。例如:
- SYSTEM_855 — 基于代码页 855 的系统排序
- 这类名称不需要指定具体语言,直接继承操作系统设置,适合通用场景。
2. 基于 Unicode 排序算法(UCA)的排序规则
这是最常用的一组,命名格式为 UCA<版本>_<语言/区域>,例如:
- UCA400R1_DE — 针对德语(Germany)的 UCA 4.0.0 修订版 1 排序
- UCA400R1_FR_CA — 针对加拿大法语的排序
- UCA500R1_JA — 针对日语的 UCA 5.0.0 排序
v11.5.9 新增了对 UCA 6.0.0 及其修订版本的支持,如 UCA600R1_ZH(简体中文,按拼音排序)和 UCA600R1_ZH_HK(繁体中文,按笔画排序)。
3. 特定代码页排序规则
为保持向后兼容,还保留了以代码页号命名的规则,例如:
- 1208 — UTF-8 代码页的默认排序
- 1252 — 拉丁语系代码页排序
4. 自定义排序规则名称
从 v11.5.9 起,用户也可以通过 CREATE COLLATION 语句注册自定义排序规则,然后在 COLLATION_KEY() 中直接使用自定义的名称。
关键要点与实践建议
如何获取当前系统所有可用的排序规则名称?
执行以下 SQL 查询:
SELECT DISTINCT COLLATION_NAME FROM SYSCAT.COLLATIONS;
该命令会列出当前实例中所有已定义的排序规则名称(包括系统内置和用户自定义的)。
常见错误与解决
升级到 v11.5.9 后,如果继续使用旧版名称(例如旧版中允许的 UCA400R1_LDE),DB2 会返回 SQL0438N 错误,提示排序规则不存在。正确的写法应为 UCA400R1_DE(去掉前缀 L)。
性能优化提示
COLLATION_KEY() 函数在过滤和排序中性能开销较大。建议在需要频繁排序的列上创建基于排序键的 索引:
CREATE INDEX idx_collation ON mytable (COLLATION_KEY(name, 'UCA600R1_ZH'));
这样查询中的 ORDER BY 或 GROUP BY 可以走索引加速。
总结
DB2 LUW v11.5.9 对 COLLATION_KEY() 函数支持的排序规则名称进行了标准化和扩展,为多语言应用提供了更清晰、更强大的字符排序能力。建议开发者在升级后及时检查并更新现有查询中的排序规则名称,同时利用新增的 UCA 6.0.0 规则来改善中文、日文等复杂文字的排序准确性。如需完整清单,请参阅 IBM 官方文档《DB2 for Linux, UNIX, and Windows 11.5.9 排序规则参考》。