Як змінити кодування символів бази даних postgres?


82

У мене є база даних, яка була налаштована із набором символів за замовчуванням SQL_ASCII. Я хочу перемкнути його на UNICODE. Чи є простий спосіб це зробити?


1
Дивіться також stackoverflow.com/q/380924
DSH

Відповіді:


64

Щоб змінити кодування вашої бази даних:

  1. Дамп бази даних
  2. Відкиньте свою базу даних,
  3. Створіть нову базу даних з іншим кодуванням
  4. Перезавантажте свої дані.

Переконайтесь, що під час усього цього кодування клієнта встановлено правильно.

Джерело: http://archives.postgresql.org/pgsql-novice/2006-03/msg00210.php


Справа в тому, що я не отримую посилання: "Перевірте, чи файл дампа, створений на першому кроці, містить спеціальні символи та
внесіть

1
Чи можете ви, будь ласка, додати команди для скидання та повторного імпорту до вашої відповіді? як sudo -u postgres pg_dump your_db > /backups/postgresql.sql...
rubo77

104

По-перше, відповідь Даніеля - правильний, безпечний варіант.

Для конкретного випадку переходу з SQL_ASCII на щось інше, ви можете обдурити і просто просунути каталог pg_database, щоб перепризначити кодування бази даних. Це передбачає, що ви вже зберегли будь-які символи, що не належать до ASCII, у передбачуваному кодуванні (або що ви просто не використовували символи, що не належать до ASCII).

Тоді ви можете зробити:

update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = 'thedb'

Це не змінить сортування бази даних, а лише те, як закодовані байти перетворюються в символи (тому тепер length('£123')повернеться 4 замість 5). Якщо база даних використовує сортування 'C', порядок рядків ASCII не повинен змінюватися. Вам, ймовірно, доведеться перебудувати будь-які індекси, що містять символи, що не належать до ASCII.

Застереження emptor. Скидання та перезавантаження забезпечує спосіб перевірки вмісту бази даних насправді у кодуванні, яке ви очікуєте, але це не так. І якщо виявиться, що у вас в базі даних були неправильно закодовані дані, порятунок буде важким. Тож, якщо ви можете, скиньте та повторно ініціалізуйте.


1
+1 Дякую. У моїй розробницькій машині використовується кодування UTF8, але в моїй роботі використовується LATIN1. Я мав багато помилок через це.
Луїс Дамім,

1
Це дає мені таку помилку: -bash: syntax error near unexpected token (``
Abhipso Ghosh

@AbhipsoGhosh це не слід вставляти в оболонку bash, а psqlпідказкою.
П'єр,

14

Скидання бази даних із певним кодуванням та спроба відновити її в іншій базі даних з іншим кодуванням може призвести до пошкодження даних. Кодування даних має бути встановлено ДО будь-яких даних, вставлених у базу даних.

Перевірте це : Під час копіювання будь-якої іншої бази даних параметри кодування та мови не можна змінити з параметрами вихідної бази даних, оскільки це може призвести до пошкодження даних.

І це : При створенні бази даних у деяких категоріях мов повинні бути виправлені значення. Ви можете використовувати різні параметри для різних баз даних, але як тільки база даних буде створена, ви більше не зможете змінити їх для цієї бази даних. LC_COLLATE та LC_CTYPE - це ці категорії. Вони впливають на порядок сортування індексів, тому їх слід утримувати фіксованими, інакше індекси у стовпцях тексту можуть пошкодитися. ( Але ви можете пом'якшити це обмеження за допомогою сортування, як обговорюється в Розділі 22.2. ) Значення за замовчуванням для цих категорій визначаються під час запуску initdb, і ці значення використовуються при створенні нових баз даних, якщо інше не вказано в команді CREATE DATABASE.


Я вважаю за краще відновлювати все з самого початку з правильним локальним кодуванням на вашій debian OS, як пояснено тут :

su root

Налаштуйте свої локальні налаштування:

dpkg-reconfigure locales

Виберіть свій регіон (як, наприклад, для французької у Швейцарії: fr_CH.UTF8)

Видаліть і очистіть належним чином postgresql:

apt-get --purge remove postgresql\*
rm -r /etc/postgresql/
rm -r /etc/postgresql-common/
rm -r /var/lib/postgresql/
userdel -r postgres
groupdel postgres

Перевстановіть postgresql:

aptitude install postgresql-9.1 postgresql-contrib-9.1 postgresql-doc-9.1

Тепер будь-яку нову базу даних буде автоматично створено з правильним кодуванням, LC_TYPE (класифікація символів) та LC_COLLATE (порядок сортування рядків).


2
Я думаю, що це "dpkg-reconfigure locales", множина. Форма однини, здається, не працює (просто перевірено).
foo

9

Відповідь Даніеля Кутіка правильна, але вона може бути ще більш безпечною, якщо перейменувати базу даних .

Отже, справді безпечним способом є:

  1. Створіть нову базу даних з іншим кодуванням та назвою
  2. Дамп бази даних
  3. Відновити дамп до нової БД
  4. Перевірте, чи правильно працює ваша програма з новою БД
  5. Перейменуйте стару БД на щось значуще
  6. Перейменуйте нову БД
  7. Перевірте заявку ще раз
  8. Відкиньте стару базу даних

У екстрених випадках просто перейменуйте БД назад


7
# dump into file
pg_dump myDB > /tmp/myDB.sql

# create an empty db with the right encoding (on older versions the escaped single quotes are needed!)
psql -c 'CREATE DATABASE "tempDB" WITH OWNER = "myself" LC_COLLATE = '\''de_DE.utf8'\'' TEMPLATE template0;'

# import in the new DB
psql -d tempDB -1 -f /tmp/myDB.sql

# rename databases
psql -c 'ALTER DATABASE "myDB" RENAME TO "myDB_wrong_encoding";' 
psql -c 'ALTER DATABASE "tempDB" RENAME TO "myDB";'

# see the result
psql myDB -c "SHOW LC_COLLATE"   
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.