具有超过 1 个变音符号的字符的 Postgres UNACCENT
Postgres UNACCENT for character with more than 1 diacritic
UNACCENT
函数可以去除字符的变音符号。但是,就我而言,它只能去除带有 1 个变音符号的字符,例如
- Thành
- 超人
- 啊啊啊
对于有 1 个以上变音符号的字符,UNACCENT
什么都不做,例如
- 呼
- ầ
- phố
有没有办法让 Postgres 去掉这些字符的重音符号?
谢谢
PostgreSQL 的 unaccent
模块不使用 Unicode 规范化,而只是一个简单的搜索和替换字典。默认字典 unaccent.rules
不包含这些越南字符,因此什么都不做。
不过您可以创建自己的非重音词典。 As explained in the documentation:
创建一个文本文件vietnamese.rules
,内容类似于
ầ a
Ầ A
ồ o
Ồ O
将vietnamese.rules
移动到文件夹$SHAREDIR/tsearch_data/
(通常是/usr/share/postgresql/tsearch_data
)
运行函数为
SELECT unaccent('vietnamese', 'Hồ ầ phố');
-- ^~~~~~~~~~~~~
您可以创建一个新函数来完成 unaccent
如下工作:
CREATE OR REPLACE FUNCTION public.vietnamese_unaccent(text)
RETURNS text
LANGUAGE plpgsql
AS $function$
DECLARE
input_string text := ;
BEGIN
input_string := translate(input_string, 'áàãạảAÁÀÃẠẢăắằẵặẳĂẮẰẴẶẲâầấẫậẩÂẤẦẪẬẨ', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
input_string := translate(input_string, 'éèẽẹẻEÉÈẼẸẺêếềễệểÊẾỀỄỆỂ', 'eeeeeeeeeeeeeeeeeeeeeeee');
input_string := translate(input_string, 'íìĩịỉIÍÌĨỊỈ', 'iiiiiiiiiii');
input_string := translate(input_string, 'óòõọỏOÓÒÕỌỎôốồỗộổÔỐỒỖỘỔơớờỡợởƠỚỜỠỢỞ', 'ooooooooooooooooooooooooooooooooooo');
input_string := translate(input_string, 'úùũụủUÚÙŨỤỦưứừữựửƯỨỪỮỰỬ', 'uuuuuuuuuuuuuuuuuuuuuuu');
input_string := translate(input_string, 'ýỳỹỵỷYÝỲỸỴỶ', 'yyyyyyyyyyy');
input_string := translate(input_string, 'dđĐD', 'dddd');
return input_string;
END;
$function$
对我有用!
如果你从 13 版本开始使用,Postgresql 已经在这里支持该功能:
select normalize('hồ, phố, ầ', NFC) → 'ho, pho, a' -- NFC (the default), NFD, NFKC, or NFKD.
UNACCENT
函数可以去除字符的变音符号。但是,就我而言,它只能去除带有 1 个变音符号的字符,例如
- Thành
- 超人
- 啊啊啊
对于有 1 个以上变音符号的字符,UNACCENT
什么都不做,例如
- 呼
- ầ
- phố
有没有办法让 Postgres 去掉这些字符的重音符号?
谢谢
PostgreSQL 的 unaccent
模块不使用 Unicode 规范化,而只是一个简单的搜索和替换字典。默认字典 unaccent.rules
不包含这些越南字符,因此什么都不做。
不过您可以创建自己的非重音词典。 As explained in the documentation:
创建一个文本文件
vietnamese.rules
,内容类似于ầ a Ầ A ồ o Ồ O
将
vietnamese.rules
移动到文件夹$SHAREDIR/tsearch_data/
(通常是/usr/share/postgresql/tsearch_data
)运行函数为
SELECT unaccent('vietnamese', 'Hồ ầ phố'); -- ^~~~~~~~~~~~~
您可以创建一个新函数来完成 unaccent
如下工作:
CREATE OR REPLACE FUNCTION public.vietnamese_unaccent(text)
RETURNS text
LANGUAGE plpgsql
AS $function$
DECLARE
input_string text := ;
BEGIN
input_string := translate(input_string, 'áàãạảAÁÀÃẠẢăắằẵặẳĂẮẰẴẶẲâầấẫậẩÂẤẦẪẬẨ', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
input_string := translate(input_string, 'éèẽẹẻEÉÈẼẸẺêếềễệểÊẾỀỄỆỂ', 'eeeeeeeeeeeeeeeeeeeeeeee');
input_string := translate(input_string, 'íìĩịỉIÍÌĨỊỈ', 'iiiiiiiiiii');
input_string := translate(input_string, 'óòõọỏOÓÒÕỌỎôốồỗộổÔỐỒỖỘỔơớờỡợởƠỚỜỠỢỞ', 'ooooooooooooooooooooooooooooooooooo');
input_string := translate(input_string, 'úùũụủUÚÙŨỤỦưứừữựửƯỨỪỮỰỬ', 'uuuuuuuuuuuuuuuuuuuuuuu');
input_string := translate(input_string, 'ýỳỹỵỷYÝỲỸỴỶ', 'yyyyyyyyyyy');
input_string := translate(input_string, 'dđĐD', 'dddd');
return input_string;
END;
$function$
对我有用!
如果你从 13 版本开始使用,Postgresql 已经在这里支持该功能:
select normalize('hồ, phố, ầ', NFC) → 'ho, pho, a' -- NFC (the default), NFD, NFKC, or NFKD.