У мене є база даних, яка була налаштована із набором символів за замовчуванням SQL_ASCII. Я хочу перемкнути його на UNICODE. Чи є простий спосіб це зробити?
У мене є база даних, яка була налаштована із набором символів за замовчуванням SQL_ASCII. Я хочу перемкнути його на UNICODE. Чи є простий спосіб це зробити?
Відповіді:
Щоб змінити кодування вашої бази даних:
Переконайтесь, що під час усього цього кодування клієнта встановлено правильно.
Джерело: http://archives.postgresql.org/pgsql-novice/2006-03/msg00210.php
sudo -u postgres pg_dump your_db > /backups/postgresql.sql
...
По-перше, відповідь Даніеля - правильний, безпечний варіант.
Для конкретного випадку переходу з 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. Скидання та перезавантаження забезпечує спосіб перевірки вмісту бази даних насправді у кодуванні, яке ви очікуєте, але це не так. І якщо виявиться, що у вас в базі даних були неправильно закодовані дані, порятунок буде важким. Тож, якщо ви можете, скиньте та повторно ініціалізуйте.
-bash: syntax error near unexpected token
(``
psql
підказкою.
Скидання бази даних із певним кодуванням та спроба відновити її в іншій базі даних з іншим кодуванням може призвести до пошкодження даних. Кодування даних має бути встановлено ДО будь-яких даних, вставлених у базу даних.
Перевірте це : Під час копіювання будь-якої іншої бази даних параметри кодування та мови не можна змінити з параметрами вихідної бази даних, оскільки це може призвести до пошкодження даних.
І це : При створенні бази даних у деяких категоріях мов повинні бути виправлені значення. Ви можете використовувати різні параметри для різних баз даних, але як тільки база даних буде створена, ви більше не зможете змінити їх для цієї бази даних. 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 (порядок сортування рядків).
Відповідь Даніеля Кутіка правильна, але вона може бути ще більш безпечною, якщо перейменувати базу даних .
Отже, справді безпечним способом є:
У екстрених випадках просто перейменуйте БД назад
# 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"