该UNACCENT
函数可以去除字符的变音符号。但是,就我而言,它只能去除带有 1 个变音符号的字符,例如
- 清
- 超人
- 啊啊啊
对于超过 1 个变音符号的字符,UNACCENT
什么都不做,例如
- 许</li>
- ầ</li>
- phố</li>
有没有办法让 Postgres 去除这些字符的重音?
谢谢
该UNACCENT
函数可以去除字符的变音符号。但是,就我而言,它只能去除带有 1 个变音符号的字符,例如
对于超过 1 个变音符号的字符,UNACCENT
什么都不做,例如
有没有办法让 Postgres 去除这些字符的重音?
谢谢
PostgreSQL 的unaccent
模块不使用 Unicode 规范化,而只是一个简单的搜索和替换字典。默认字典unaccent.rules
不包含这些越南语字符,因此什么也不做。
不过,您可以创建自己的非重音字典。如文档中所述:
创建一个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 := $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$
它对我有用!
如果您从版本 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