web-dev-qa-db-ja.com

SQLまたはphpPgAdminを使用してPostgreSQLデータベースのデータベースエンコーディングを変更するにはどうすればよいですか?

SQLまたはphpPgAdminを使用して、PostgreSQLデータベースのデータベースエンコーディングを変更するにはどうすればよいですか?

27
daniels

つまり、phpPgAdminまたはSQLだけでは既存のデータ破損のリスクを冒すことなくこれを行うことはできません。すべてのデータをエクスポートし、正しいエンコードでデータベースを作成し、エクスポートしたデータを復元する必要があります。

これはあなたが続行する方法です:

  1. データベースダンプの作成

    pg_dump your_database > your_database.sql

    これにより、現在使用しているエンコーディングで、データベースがSQL形式で保存されます。

  2. データベースを削除(または名前を変更):

    DROP DATABASE your_database

    それを行うのに十分なストレージがある場合は、新しいデータベースですべてが問題ないことを確認するまで、古いデータベースを残しておくことをお勧めしますrename 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情報を変更するだけで、この変更後の新しいデータは正しく保存されますが、既存のデータ破損する可能性がありますです。

43
rombarcz

ダンプ/復元せずにオンザフライでエンコーディングを変更できます:

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

与えられた答えを拡張するには、これらのコマンドを使用してタスクを実行できます。

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

4
Bobort