Итак, у меня есть несколько серверов Debian с PostgreSQL на нем. Исторически эти серверы и PostgreSQL были локализованы с помощью набора символов Latin 9, и тогда это было нормально. Теперь мы должны разобраться с такими вещами, как польский, греческий или китайский, поэтому изменение становится растущей проблемой.
Когда я попытался создать базу данных UTF8, я получил сообщение:
ОШИБКА: кодировка UTF8 не соответствует локали fr_FR. Подробно: выбранная настройка LC_CTYPE требует кодировки LATIN9.
Пару раз я проводил некоторые исследования по этому вопросу со своим старым приятелем Google, и все, что я мог найти, было несколько слишком сложных процедур, таких как обновление Debian LANG
, перекомпиляция PostgreSQL с помощью правильной кодировки, редактирование всех LC_
системных переменных и других непонятных решений. Поэтому пока мы оставляем этот вопрос в стороне.
Недавно он снова вернулся, греки хотят вещи, а латынь 9 не хотят. И пока я снова изучал этот вопрос, один коллега подошел ко мне и сказал: «Нет, это просто, смотри».
Он ничего не редактировал, не делал фокусов, он просто делал SQL-запрос:
CREATE DATABASE my_utf8_db
WITH ENCODING='UTF8'
OWNER=admin
TEMPLATE=template0
LC_COLLATE='C'
LC_CTYPE='C'
CONNECTION LIMIT=-1
TABLESPACE=pg_default;
И это работало нормально.
Я на самом деле не знал об этом, LC_CTYPE='C'
и я был удивлен, что его использование не было в первых решениях в Google и даже в переполнении стека. Я оглянулся и нашел только упоминание в документации PostgreSQL.
Когда LC_CTYPE - C или POSIX, любой набор символов разрешен, но для других настроек LC_CTYPE есть только один набор символов, который будет работать правильно. Поскольку настройка LC_CTYPE замораживается initdb, очевидная гибкость использования разных кодировок в разных базах данных кластера является более теоретической, чем реальной, за исключением случаев, когда вы выбираете язык C или POSIX (таким образом отключая любую реальную осведомленность о языке).
Это заставило меня задуматься, это слишком просто, слишком идеально, каковы недостатки? И мне пока трудно найти ответ. Итак, я прихожу сюда:
tl; dr: Каковы недостатки использования LC_CTYPE='C'
определенной локализации? Разве это плохо? Что я должен ожидать, чтобы сломаться?
источник
collate "C"
послеorder by
. Вам решать, нужно ли и где это необходимо вашему приложению. Большинству приложений там все равно.COLLATE
спецификатор, который отличается от базы данных.В связи с принятым ответом Даниэля о сортировке с использованием параметров сортировки, имейте в виду, что если вы используете PostgreSQL на Mac, то предпочитаемый режим сортировки может работать не так, как вы ожидаете, из-за неадекватных настроек некоторых параметров сортировки на уровне операционной системы. Вы можете прочитать больше о проблеме здесь:
http://www.postgresql.org/message-id/4B4E845F.80906@postnewspapers.com.au
Это не специфическая проблема PostgreSQL, а скорее проблема с настройками по умолчанию для Mac для параметров сортировки. Моя текущая система работает на PostgreSQL 9.3 в OS X El Capitan Version 10.11 и страдает от этой проблемы. Моя система возвращает одинаковые результаты запроса независимо от того, использую ли я сопоставление «fr_FR» или «en_US». Например:
Используя сопоставление «fr_FR»:
Используя сопоставление «en_US»:
В моей системе параметры сортировки (на уровне операционной системы) такие же для «fr_FR» и «en_US», как показано в оболочке при запуске diff:
Надеемся, что эта дополнительная информация будет полезна всем, кто читает эту статью и использует PostgreSQL на Mac, который страдает от этой проблемы.
источник