Как изменить кодировку символов в базе данных postgres? - PullRequest
70 голосов
/ 23 февраля 2011

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

Ответы [ 5 ]

94 голосов
/ 23 февраля 2011

Во-первых, ответ Даниэля - правильный, безопасный вариант.

Для конкретного случая перехода с 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-символы.

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

53 голосов
/ 23 февраля 2011

Чтобы изменить кодировку вашей базы данных:

  1. Дамп вашей базы данных
  2. Бросьте свою базу данных,
  3. Создать новую базу данных с другой кодировкой
  4. Перезагрузите ваши данные.

Убедитесь, что кодировка клиента установлена ​​правильно во время всего этого.

Источник: http://archives.postgresql.org/pgsql-novice/2006-03/msg00210.php

10 голосов
/ 31 декабря 2013

Вывод базы данных с определенной кодировкой и попытка восстановить ее в другой базе данных с другой кодировкой может привести к повреждению данных.Кодировка данных должна быть установлена ​​ДО того, как какие-либо данные будут вставлены в базу данных.

Проверьте this : При копировании любой другой базы данных настройки кодирования и локали не могут быть изменены по сравнению с настройкамиисходная база данных, поскольку это может привести к повреждению данных.

И this : Некоторые категории языковых стандартов должны иметь свои значения фиксированными при создании базы данных.Вы можете использовать разные настройки для разных баз данных, но как только база данных будет создана, вы не сможете больше их изменять для этой базы данных. 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 (сортировка строк).заказ).

7 голосов
/ 12 февраля 2017

Ответ Даниэля Кутика правильный, но он может быть еще более безопасным, с переименованием базы данных .

Итак, по-настоящему безопасный способ:

  1. Создать новую базу данных с другой кодировкой и именем
  2. Дамп вашей базы данных
  3. Восстановить дамп в новую БД
  4. Проверьте, правильно ли работает ваше приложение с новой БД
  5. Переименуйте старую БД во что-то значимое
  6. Переименовать новую БД
  7. Снова протестировать приложение
  8. Удалить старую базу данных

В случае необходимости просто переименуйте БД обратно

3 голосов
/ 10 июля 2018
# 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"   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...