Как я могу изменить кодировку базы данных для базы данных PostgreSQL с помощью sql или phpPgAdmin?

Как я могу изменить кодировку базы данных для базы данных PostgreSQL с помощью sql или phpPgAdmin?

Ответ 1

Короче говоря, вы не можете сделать это только с помощью phpPgAdmin или SQL, не рискуя существующим повреждением данных. Вы должны экспортировать все данные, создать базу данных с правильным кодированием и восстановить экспортированные данные.

Вот как вы должны действовать:

  • создать дамп базы данных:

    pg_dump your_database > your_database.sql

    это сохранит вашу базу данных в формате sql, в кодировке, которую вы в настоящее время имеете.

  • удалить базу данных (или переименовать ее):

    DROP DATABASE your_database

    Если у вас достаточно памяти для этого, я рекомендую оставить старую базу данных, пока вы не убедитесь, что все в порядке с новым, переименовать:

    ALTER DATABASE your_database RENAME TO your_database_backup;

  • создать базу данных с новой кодировкой:

    CREATE DATABASE your_database WITH ENCODING 'UNICODE' TEMPLATE=template0;

  • импортировать данные из дампа, созданного до:

    PGCLIENTENCODING=YOUR_OLD_ENCODING psql -f your_database.sql your_database

    вам нужно установить кодировку клиента psql в ту, что у вас была в старой базе данных.

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

Можно просто изменить внутренние сообщения postgres о базе данных и любых новых данных после того, как это изменение будет сохранено правильно, однако ваши существующие данные могут быть повреждены.

Ответ 2

Вы можете изменить кодировку "на лету" без дампа/восстановления:

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

Ответ 3

Чтобы расширить приведенные ответы, вы можете использовать эти команды для выполнения своей задачи.

// Backup the database to outfile
pg_dump dbname > outfile

// Terminate all connections to the database
psql -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='dbname';"

// Delete the database
psql -c "DROP DATABASE dbname;"

//Re-create the database using the encoding keyword
psql -c "CREATE DATABASE dbname ENCODING='UTF8';"

//Import the saved data
psql -f outfile

База данных сброса: http://www.postgresql.org/docs/9.4/static/backup-dump.html

Создание базы данных: http://www.postgresql.org/docs/9.4/static/sql-createdatabase.html

Это список всех кодировок, доступных для версии 9.4: http://www.postgresql.org/docs/9.4/static/multibyte.html#MULTIBYTE-CHARSET-SUPPORTED