Порядок сортировки строк (LC_COLLATE и LC_CTYPE) - PullRequest
4 голосов
/ 03 ноября 2011

Очевидно, PostgreSQL позволяет использовать разные локали для каждой базы данных, начиная с версии 8.4. Поэтому я пошел в документы, чтобы прочитать о локалях (http://www.postgresql.org/docs/8.4/static/locale.html).

Порядок сортировки строк представляет особый интерес (я хочу, чтобы строки сортировались как 'A a b c D d', а не 'A B C ... Z a b c').

Вопрос 1. Нужно ли устанавливать LC_COLLATE (порядок сортировки строк) только при создании базы данных?

Я также читал о LC_CTYPE (символьная классификация (что такое буква? Ее эквивалент в верхнем регистре?))

Вопрос 2: Может кто-нибудь объяснить, что это значит?

Ответы [ 2 ]

2 голосов
/ 03 ноября 2011

Порядок сортировки, который вы описываете, является стандартным в большинстве языков. Попробуйте сами:

SELECT regexp_split_to_table('D d a A c b', ' ') ORDER BY 1;

Когда вы инициализируете кластер БД с помощью initdb , вы можете выбрать локаль с помощью --locale=some_locale. В моем случае это --locale=de_AT.UTF-8. Если вы ничего не указали, языковой стандарт унаследован от среды - будет использоваться ваш текущий системный языковой стандарт.

База данных шаблонов кластера будет настроена на эту локаль. Когда вы создаете новую базу данных, она наследует настройки из шаблона. Обычно вам не нужно беспокоиться о чем-либо , все это просто работает.

Подробнее читайте в главе СОЗДАТЬ БАЗУ ДАННЫХ . Если вы хотите ускорить текстовый поиск по индексам, обязательно прочитайте также о классах операторов .
Все ссылки на версию 8.4, как вы специально об этом просили.


В PostgreSQL 9.1 или более поздней версии имеется поддержка сортировки , которая позволяет более гибко использовать параметры сортировки:

Функция сортировки позволяет указать порядок сортировки и символ классификационное поведение данных для каждого столбца или даже для каждой операции. Это смягчает ограничение, что LC_COLLATE и LC_CTYPE настройки базы данных не могут быть изменены после ее создания.

0 голосов
/ 22 августа 2014

По сравнению с другими базами данных, PostgreSQL гораздо строже относится к чувствительности к регистру. Чтобы избежать этого при оформлении заказа, вы можете использовать строковые функции, чтобы сделать его чувствительным к регистру:

SELECT * FROM users ORDER BY LOWER(last_name), LOWER(first_name);

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

Бонус:

Вы можете столкнуться с этой проблемой и при поиске, в этом случае есть оператор сравнения шаблонов без учета регистра:

SELECT * FROM users WHERE first_name ILIKE "%john%";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...