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

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


person daniels    schedule 19.12.2008    source источник


Ответы (3)


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

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

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

    pg_dump your_database > your_database.sql

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

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

    DROP DATABASE your_database

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

    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 о базе данных, и любые новые данные после этого изменения будут сохранены правильно, однако ваши существующие данные могут быть повреждены.

person rombarcz    schedule 19.12.2008
comment
у меня есть учетная запись cpanel, и если я сделаю резервную копию базы данных, я смогу восстановить только контент, а не воссоздать базу данных с новой кодировкой - person daniels; 19.12.2008
comment
drop = удалить, вот ссылка на документы cpanel: cpanel.net/support/ docs/11/cpanel/databases_delete_post.html - person rombarcz; 19.12.2008
comment
Новичок в PostgreSQL... Как это сделать с помощью SQL и/или инструмента командной строки psql? Например, если база данных и сервер в настоящее время настроены на SQL_ASCII, но я хочу, чтобы это была UTF-8? - person Svish; 15.02.2011
comment
новичок вы или нет, вы должны знать свои инструменты, используйте pg_dump для дампа базы данных, psql -f для импорта ранее выгруженных данных. удалить/создать базу данных, вы можете использовать множество различных инструментов, sql (DROP DATABASE/CREATE DATABASE [postgresql.org/docs/9.0/static/sql-createdatabase.html]), phpPgAdmin, pgAdmin (визуальные инструменты). ПРОЧИТАЙТЕ документацию по инструменту перед выполнением каких-либо действий. - person rombarcz; 17.02.2011
comment
Нашел эту ссылку для PostgresSQL archives.postgresql.org/pgsql-novice/2006 -03/msg00210.php - person Sash; 19.07.2012
comment
А если данных еще нет? - person Gediminas; 10.05.2013

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

update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = 'database_name'
person user1941407    schedule 15.08.2015
comment
Теперь это полезный ответ. Создать базу данных с новой кодировкой — невероятно бесполезная инструкция, когда сам вопрос заключается в том, как изменить кодировку в базе данных? - person Bobort; 20.08.2015
comment
Это задокументировано где-нибудь в руководстве по postgres? игра с внутренностями postgresql и простое обновление справочной информации могут привести к серьезным повреждениям. Если это действительно перезапишет все индексы и необходимые данные, это здорово! Но если нет, вы можете в конечном итоге восстановить из резервных копий. - person rombarcz; 13.12.2015
comment
@Bobort, вы правы .. но есть некоторые предостережения по изменению на лету stackoverflow.com/a/5091083/903998.. кажется, что правильный выбор - начать со свежей базы данных (postgres) - person Victor; 24.11.2016
comment
Это дает мне эту ошибку: -bash: syntax error near unexpected token ('` - person Abhipso Ghosh; 24.06.2017
comment
это сломает существующий текст utf-8 - person aldo; 20.02.2021

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

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

person Bobort    schedule 20.08.2015