具有超过 1 个变音符号的字符的 Postgres UNACCENT

Postgres UNACCENT for character with more than 1 diacritic

UNACCENT 函数可以去除字符的变音符号。但是,就我而言,它只能去除带有 1 个变音符号的字符,例如

对于有 1 个以上变音符号的字符,UNACCENT 什么都不做,例如

有没有办法让 Postgres 去掉这些字符的重音符号?

谢谢

PostgreSQL 的 unaccent 模块不使用 Unicode 规范化,而只是一个简单的搜索和替换字典。默认字典 unaccent.rules 不包含这些越南字符,因此什么都不做。

不过您可以创建自己的非重音词典。 As explained in the documentation:

  1. 创建一个文本文件vietnamese.rules,内容类似于

    ầ  a
    Ầ  A
    ồ  o
    Ồ  O
    
  2. vietnamese.rules移动到文件夹$SHAREDIR/tsearch_data/(通常是/usr/share/postgresql/tsearch_data

  3. 运行函数为

    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.

文档:https://www.postgresql.org/docs/13/functions-string.html