Postgres UNACCENT для персонажа с более чем 1 диакритическим знаком

UNACCENT функция может лишить персонажей диакритических знаков. Однако в моем случае он может удалять только символы с 1 диакритическим знаком, например,

  • Thành
  • сверхчеловек
  • aaÃ

Для персонажей с более чем 1 диакритическим знаком, UNACCENT ничего не делает, например

  • Hồ
  • Phố

Есть ли способ позволить Postgres убрать акценты с этих персонажей?

Спасибо

3 ответа

Решение

PostgreSQL, unaccent Модуль не использует нормализацию Unicode, а только простой словарь поиска и замены. Словарь по умолчанию, unaccent.rules, не содержит этих вьетнамских символов, поэтому ничего не делается.

Вы можете создать свой собственный словарь unaccent, хотя. Как объяснено в документации:

  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 := $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

Другие вопросы по тегам