Каковы рекомендуемые параметры сортировки для уникального столбца электронной почты PostgreSQL?

В большинстве мест рекомендуется использовать уникальные индексы электронной почты с ​​использованием индекса lower(email) или типа данных citext.

Но руководство для citext предлагает использовать сопоставление для всех случаев вместо citext сейчас:

Рассмотрите возможность использования недетерминированных правил сортировки вместо этого модуля.

Итак, как в настоящее время рекомендуется обрабатывать уникальный столбец электронной почты в PostgreSQL?

Индекс на lower()? citext еще? Или, если сопоставление, то какое именно?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

если сопоставить, то какой именно?

Какой бы вариант вы ни предпочли, речь идет не обязательно о выборе определенного параметра сортировки из встроенного списка, а о его настройке таким образом. Как показано в документе:
демо на db<>fiddle

CREATE COLLATION case_insensitive (
  provider = icu, 
  locale = 'und-u-ks-level2', --undefined(root,generic), but you can pick a language
  deterministic = false);
SELECT 'a' = 'A' COLLATE case_insensitive; -- true

Если вы спрашиваете, какой языковой стандарт рекомендуется для сортировки без учета регистра, я бы сказал, что это общий язык, описанный выше, но в конечном итоге это не имеет значения. Другие в основном различаются тем, как они сортируют вещи, и, если они специально не настроены для этой цели, я не думаю, что они не согласятся с равенством, которого вы хотите unique.

Я предположил, что вы спрашиваете, какая конкретная сортировка является рекомендацией, и в этом случае такой вещи нет - стандартная установка не поставляется со встроенной регистронезависимой сортировкой из коробки. Японский, арабский и китайский являются примерами языков, «нечувствительных к регистру» (символы не имеют верхних и нижних вариантов), но основанные на них параметры сортировки сами по себе не учитывают регистр, когда имеют дело с другими алфавитами.

Если вы спрашиваете о производительности, то в этом тесте на 150 тыс. 90% уникальных случайных выборках, а также в другом тесте, который я проводил на 10M, индекс выражения с использованием lower() в столбце text с collate "C" имеет тенденцию работать лучше всего, за ним следует обычный индекс текстового столбца с использованием сортировки icu без учета регистра. citext остается далеко позади.


Я хочу сказать, что набор символов для электронной почты не подлежит интерпретации. email rfc использует ascii, с удаленными несколькими символами, стандарты интернационализации его не заботят.

Существует более одного «электронного RFC», поэтому можно утверждать, что даже значение «электронного RFC» открыто для интерпретации. Кроме того, это не «только ASCII, с удаленными несколькими символами», или, по крайней мере, это не так уже давно. Вот относительно старая тема , в которой обсуждаются эти темы, со ссылкой на хороший пример в Википедии:

Приведенные ниже примеры адресов не будут обрабатываться серверами на основе RRFC 5322, но разрешены RFC 6530. Серверы, соответствующие этому стандарту, смогут обрабатывать их:

  • Латинский алфавит с диакритическими знаками: Pelé@example.com
  • Греческий алфавит: δοκιμή@παράδειγμα.δοκιμή
  • Традиционные китайские иероглифы: 我買@屋企.香港
  • Японские иероглифы: 二ノ宮@黒川.日本
  • Кириллические символы: медведь@с-балалайкой.рф
  • Персонажи деванагари: संपर्क@डाटामेल.भारत

Я чувствую, что мне нужно подвести черту: наборы символов — это кодировка . Параметры сортировки, о которых вы спрашивали, предназначены для сортировки и равенства, и большинство из них работают со всеми вариантами кодирования. Вы можете это узнать, проверив pg_collation.collencoding = -1:

collencoding int4
Кодировка, в которой применимо сопоставление, или -1, если оно работает для любой кодировки.

Если вы хотите спросить о проверке и нормализации адреса электронной почты с помощью ограничения столбца, это немного другой вопрос.

тот, который идеально подходит для электронной почты, — это не совсем личное предпочтение :)

gcb 18.07.2024 19:54

Спасибо за обновление ответа. Я хочу сказать, что набор символов для электронной почты не подлежит интерпретации. email rfc использует ascii, с удаленными несколькими символами, стандарты интернационализации его не заботят.

gcb 18.07.2024 22:10

еще раз спасибо за поправки! Этот связанный вопрос довольно хорош, но выходит немного за рамки того, что мне нужно, хотя я многому научился... мое приложение уже кодирует utf в небольшой код в домене, а localpart/dot-atom, вы даете хорошее замечание utf8, но на самом деле поддержка RFC 6531/SMTPUTF8 очень низкая и неравномерная. Еще не решил, хочу ли я это поддержать.

gcb 26.07.2024 17:21

«Наборы символов связаны с кодировкой. Параметры сортировки, о которых вы спрашивали, предназначены для сортировки и равенства». Очень хорошая мысль. хотя это корень моего вопроса. В их собственном руководстве по типу символов citext есть большой красный прямоугольник, предлагающий вместо этого учитывать «недетерминированные сопоставления».

gcb 26.07.2024 17:23

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