Как изменить кодировку символов в базе данных postgres?

82

У меня есть база данных, которая была настроена с набором символов по умолчанию SQL_ASCII. Я хочу переключить его на UNICODE. Есть простой способ сделать это?

Ник Реталлак
источник

Ответы:

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 09
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.

Пусть покупатель будет бдителен. Выгрузка и перезагрузка позволяют проверить, действительно ли содержимое вашей базы данных соответствует ожидаемой кодировке, а это не так. И если окажется, что у вас в базе есть некорректно закодированные данные, спасти их будет сложно. Так что, если возможно, сделайте дамп и повторно инициализируйте.

аракнид
источник
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, как описано здесь :

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"   
rubo77
источник