2

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

  • 超人
  • 啊啊啊

对于超过 1 个变音符号的字符,UNACCENT什么都不做,例如

  • 许</li>
  • ầ</li>
  • phố</li>

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

谢谢

4

3 回答 3

4

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

不过,您可以创建自己的非重音字典。如文档中所述

  1. 创建一个vietnamese.rules包含如下内容的文本文件

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

  3. 运行函数为

    SELECT unaccent('vietnamese', 'Hồ ầ phố');
    --              ^~~~~~~~~~~~~
    
于 2017-04-08T11:30:51.590 回答
2

您可以创建一个新功能来完成unaccent如下工作:

CREATE OR REPLACE FUNCTION public.vietnamese_unaccent(text)
 RETURNS text
 LANGUAGE plpgsql
AS $function$
DECLARE
    input_string text := $1;
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$

它对我有用!

于 2019-12-09T05:29:10.803 回答
0

如果您从版本 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

于 2021-07-24T07:32:11.867 回答