icu_ext

访问ICU库提供的函数

概览

扩展包名版本分类许可证语言
icu_ext1.10.0UTILPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
4240icu_ext-
相关扩展pgpcre pg_xenophile unaccent gzip bzip zstd http pg_net

版本

类型仓库版本PG 大版本包名依赖
EXTMIXED1.10.01817161514icu_ext-
RPMPIGSTY1.10.01817161514icu_ext_$v-
DEBPGDG1.10.01817161514postgresql-$v-icu-ext-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64
u22.aarch64
u24.x86_64
u24.aarch64
u26.x86_64
u26.aarch64

构建

您可以使用 pig build 命令构建 icu_ext 扩展的 RPM 包:

pig build pkg icu_ext         # 构建 RPM 包

安装

您可以直接安装 icu_ext 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install icu_ext;          # 当前活跃 PG 版本安装
pig ext install -y icu_ext -v 18  # PG 18
pig ext install -y icu_ext -v 17  # PG 17
pig ext install -y icu_ext -v 16  # PG 16
pig ext install -y icu_ext -v 15  # PG 15
pig ext install -y icu_ext -v 14  # PG 14
dnf install -y icu_ext_18       # PG 18
dnf install -y icu_ext_17       # PG 17
dnf install -y icu_ext_16       # PG 16
dnf install -y icu_ext_15       # PG 15
dnf install -y icu_ext_14       # PG 14
apt install -y postgresql-18-icu-ext   # PG 18
apt install -y postgresql-17-icu-ext   # PG 17
apt install -y postgresql-16-icu-ext   # PG 16
apt install -y postgresql-15-icu-ext   # PG 15
apt install -y postgresql-14-icu-ext   # PG 14

创建扩展

CREATE EXTENSION icu_ext;

用法

来源:README, datetime docs, v1.10.0 release

icu_extICU 功能暴露给 PostgreSQL。上游要求 PostgreSQL 11+ 且编译时启用 ICU(--with-icu);pgext 目录记录的版本是 1.10.0,覆盖 PostgreSQL 14-18,v1.10.0 release 说明中提到 PostgreSQL 18 兼容性。

启用扩展

CREATE EXTENSION icu_ext;

版本信息

SELECT icu_version();           -- ICU library version
SELECT icu_unicode_version();   -- Unicode standard version

Locale 函数

SELECT * FROM icu_locales_list() WHERE name LIKE 'es%' LIMIT 5;
SELECT icu_default_locale();
SELECT icu_set_default_locale('en');

Collation 属性

SELECT * FROM icu_collation_attributes('fr-u-ks-level2-kn');

字符串比较

-- Case-sensitive, accent-insensitive comparison:
SELECT icu_compare('abce', 'abce', 'en-u-ks-level1-kc-true');  -- 0
SELECT icu_compare('Abce', 'abce', 'en-u-ks-level1-kc-true');  -- 1

排序键与语言学搜索

CREATE UNIQUE INDEX idx ON my_table((icu_sort_key(name, 'fr-u-ks-level1')));

SELECT icu_strpos('Jean-Rene Dupont', 'jeanrene', 'fr-u-ks-level1-ka-shifted');
SELECT icu_replace('Jean-Rene Dupont', 'jeanrene', '{firstname}', 'fr-u-ks-level1-ka-shifted');

文本边界分析

SELECT * FROM icu_character_boundaries('Hello', 'en');
SELECT * FROM icu_word_boundaries('I like books', 'en');
SELECT * FROM icu_sentence_boundaries('Mr. Smith went home. He was tired.', 'en');
SELECT * FROM icu_line_boundaries('Long text here', 'en');

Unicode 规范化与转换

SELECT icu_normalize('text', 'NFC');
SELECT icu_is_normalized('text', 'NFC');
SELECT icu_transform('Hello', 'Latin-Cyrillic');
SELECT * FROM icu_transforms_list();

日期与时间本地化

SET icu_ext.locale TO '@calendar=buddhist';

SELECT icu_format_date('2020-12-31'::date, '{medium}', 'en@calendar=ethiopic');
SELECT icu_parse_date('25/09/2566', 'dd/MM/yyyy');
SELECT icu_format_datetime(now(), 'GGGG dd/MMMM/yyyy HH:mm:ss.SSS z', 'fr@calendar=buddhist');

datetime 文档还定义了 icu_dateicu_timestamptzicu_interval,以及用于本地化输入/输出和感知日历算术的 icu_ext.localeicu_ext.date_formaticu_ext.timestamptz_format 设置。

数字拼写

SELECT icu_number_spellout(42, 'en');   -- 'forty-two'
SELECT icu_number_spellout(42, 'fr');   -- 'quarante-deux'

欺骗与混淆检测

SELECT icu_spoof_check('paypal');
SELECT icu_confusable_strings_check('google', 'gооgle');
SELECT icu_confusable_string_skeleton('phi1');

字符信息

SELECT icu_char_name('A');
SELECT icu_char_type('A');
SELECT icu_char_ublock_id('A');
SELECT * FROM icu_unicode_blocks() WHERE block_name = 'Basic_Latin';

注意事项

  • 依赖 ICU collation 或 Unicode 数据的函数,在链接的 ICU 库变化后行为可能改变。
  • icu_sort_key() 适合用于索引,但基于排序键构建的索引在 ICU 升级后应复核。

最后修改 2026-05-18: routine extension update (ac43610)