Postgres UNACCENT для персонажа с более чем 1 диакритическим знаком
UNACCENT
функция может лишить персонажей диакритических знаков. Однако в моем случае он может удалять только символы с 1 диакритическим знаком, например,
- Thành
- сверхчеловек
- aaÃ
Для персонажей с более чем 1 диакритическим знаком, UNACCENT
ничего не делает, например
- Hồ
- Phố
Есть ли способ позволить Postgres убрать акценты с этих персонажей?
Спасибо
3 ответа
PostgreSQL, unaccent
Модуль не использует нормализацию Unicode, а только простой словарь поиска и замены. Словарь по умолчанию, unaccent.rules
, не содержит этих вьетнамских символов, поэтому ничего не делается.
Вы можете создать свой собственный словарь unaccent, хотя. Как объяснено в документации:
Создать текстовый файл
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