Как справиться с чувствительностью к регистру в PostgreSQL

#sql #string #postgresql #unique-constraint #check-constraints

#sql #строка #postgresql #уникальное ограничение #проверка-ограничения

Вопрос:

У меня есть основная таблица для цветовых кодов, в которой хранятся различные уникальные значения цвета. В нем есть столбец Color_value, к которому применено УНИКАЛЬНОЕ ограничение. Однако он принимает как «черные», так и «черные» значения. Как можно справиться с подобными ситуациями?

Комментарии:

1. Я бы указал сопоставление без учета регистра для столбца.

Ответ №1:

Вы можете создать уникальный индекс следующим образом:

 create unique index unique_color_value on colors(lower(color_value));
 

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

 create table colors (
    ...
    color_value text 
        unique 
        check(color_value = lower(color_value))
)
 

Комментарии:

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

2. @Kartikeya: да, это моя точка зрения. Тогда вам больше не нужно будет беспокоиться об этом деле в дальнейшем.

3. Хорошо, но если мне нужно поддерживать чувствительность к регистру, чтобы отображать данные в том виде, в каком они есть в моем приложении, будет ли это работать таким образом?

4. @Kartikeya: в таком случае используйте уникальный индекс, который я предлагаю в начале ответа.

Ответ №2:

Одним из вариантов может быть уникальный индекс, как подробно описано в ответе GMB.

Другие варианты:

  • Используйте citext расширение (например, чувствительный текст) и используйте citext тип данных. Затем вы можете использовать простое ограничение уникальности.
  • В PostgreSQL версии 12 или выше создайте сопоставление ICU без учета регистра:
     CREATE COLLATION german_ci (
       LOCALE = 'de_AT@colStrength=secondary',
       PROVIDER = 'icu',
       DETERMINISTIC = FALSE
    );
     

    Этот пример предназначен для австрийского немецкого языка, используйте язык по вашему выбору или используйте und для сопоставления независимо от языка (насколько такая вещь существует).

    Затем определите столбец как colname text COLLATE german_ci UNIQUE , используя обычное ограничение unique.