Вплив локалі на роботу PostgreSql


Перед початком роботи з PostgreSql дуже важливим моментом є вірно задати локаль середовища, оскільки вона прямо впливає на роботу з базою даних.

За змовчанням система працює без мовної підтримки, використовуючи спеціальне ім'я локалі C або еквівалентну йому POSIX. А створена база даних буде мати кодування SQL_ASCII

 

Давайте задамо UTF-8 локаль, для цього відредагуємо файл /etc/default/locale до наступного вигляду

А в /etc/environment добавивмо наступне

Далі виконаємо наступні команди

 

Тільки після цього бажано інсталювати PostgreSql, створювати БД та приступати до роботи.

Але що робити, якщо база даних уже створена, до конфігурування локалі? На одному Rails проекті виникла проблема. Локально пошук працював як регістронезалежний, що повністю задовільняло потреби замовника, а задеплоєний проект поводив себе зовсім по іншому. Як виявилось проблема  була у локалі за змовчанням.

Згідно офіційної документації, локаль впливає на наступний функціонал SQL у PostgreSql:

  • Порядок сортування в запитах з використанням ORDER BY або стандартних операторах порівняння текстових даних;
  • Функції upper, lower та initcap;
  • Оператори пошуку за шаблоном (LIKE, SIMILAR TO, і регулярні вирази в стилі POSIX); локаль впливає як на пошук без урахування регістру, так і на класифікацію знаків за класами символів регулярних виразів
  • Сімейство функцій to_char
  • Можливість використовувати індекси з пропозиціями LIKE

Для вирішення даної проблеми можна скористатися скриптом конвертування база даних із SQL_ASCII в UTF8 кодування. В моєму випадку він не допоміг, оскільки Collate та Ctype цей скрипт не змінює. Тому нам потрібно задати кодування локалі(описано вище) та наново створити кластер PostgreSql.

Дізнаємося версію інстальованої PostgreSql

в моєму випадку це 9.3.16

УВАГА! Далі потрібно виконати бекап усіх баз даних, оскільки нище наведені команди перестворення кластеру PostgreSql знищать усі дані!

Наприклад:

В даних командах версія postgresql – 9.3, назва кластеру – main.

Наступним кроком відновлюємо наші бази даних, які ми забекапили.

 

Postgres

Create User

Change user password

Create Database

Privileges

Change database owner

Copy a database

Dump

Restore

p.s.

in Ubuntu default username database PostGres is postgres, but in FreeBSD this is pgsql

Postgres commands

 

PostgreSQL & Rails – зміна типу поля із string у integer

 

Міграція даних із SQLite3 в PostgreSQL у Rails

Часто, починаючи новий проект, в якості бази даних ми обираємо запропоновану нам за змовчанням SQLite. Звісно, вона має право на життя, але я б радив зразу використовувати PostgreSQL. SQLite заманює відсутністю необхідності інсталювати щось додаткового. Але приходить час деплою і нам потрібний PostgreSQL, та й дані, які ми внесли під час development'у часто/густо потрібно перенести.

 

Continue reading

PostgerSql – No operator matches the given name and argument type(s)

sql

Якщо маємо таблицю із id типу integer, то нижче наведений запрос в MySql буде виконаний без проблем

для  PostgreSql аналогічний sql-запрос

дасть помилку:

No operator matches the given name and argument type(s). You might need to add explicit type casts.

Це означає, що потрібно явно вказати перетворення типу. В цілях переносимості рекомендується використовувати стандартний вираз CAST

Синтаксис вираження CAST дуже простий

Для нашого прикладу правильним запросом буде наступний рядок:

 

Error installing pg