Postgres UNACCENT用于超过1个变音符号的字符

时间:2017-04-08 11:04:47

标签: postgresql diacritics unaccent

UNACCENT函数可以删除字符变音符号。但是,在我的情况下,它只能剥离带有1个变音符号的字符,例如

  • 超人
  • AAA

对于具有1个以上变音符号的字符,UNACCENT不执行任何操作,例如

  • Hồ
  • A
  • PHO

有没有办法让Postgres从这些角色中删除重音?

由于

3 个答案:

答案 0 :(得分:4)

PostgreSQL的defmodule MyApp.ApiSecurity do def init(options) do options end def call(conn, _opts) do # checking if "api-key" headers exists # and key is valid # .... what's next? # if it's a) valid # b) invalid or there's no "api-key" header # ??? end end 模块不使用Unicode规范化,而只使用简单的搜索和替换字典。默认字典unaccent.rules不包含这些越南字符,因此没有做任何事情。

你可以创建自己的非语言字典。 As explained in the documentation

  1. 使用

    等内容创建文本文件unaccent
    vietnamese.rules
  2. ầ a Ầ A ồ o Ồ O 移至文件夹vietnamese.rules(通常为$SHAREDIR/tsearch_data/

  3. 运行该功能

    /usr/share/postgresql/tsearch_data

答案 1 :(得分:1)

您可以创建一个新功能来完成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$

对我有用!

答案 2 :(得分: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