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

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

Ответы [ 3 ]

43 голосов
/ 19 декабря 2008

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

Вот как следует поступить:

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

    pg_dump your_database > your_database.sql

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

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

    DROP DATABASE your_database

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

    ALTER DATABASE your_database RENAME TO your_database_backup;

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

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

  4. импорт данных из дампа, созданного до :

    PGCLIENTENCODING=YOUR_OLD_ENCODING psql -f your_database.sql your_database

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

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

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

17 голосов
/ 15 августа 2015

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

update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = 'database_name'
4 голосов
/ 20 августа 2015

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

// 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

...