28

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

4

3 に答える 3

47

つまり、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 クライアント エンコーディングを古いデータベースにあったエンコーディングに設定する必要があります。

オンザフライでエンコーディングを変更することはできません。内部データベース データのほとんどを書き換える必要があるためです。これは、説明した方法で db を再作成するのとほぼ同じです。

データベースに関する内部 postgres 情報を変更するだけで、この変更後の新しいデータは正しく保存されますが、既存のデータが破損する可能性があります。

于 2008-12-19T13:21:37.160 に答える
18

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

update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = 'database_name'
于 2015-08-15T06:32:53.673 に答える
4

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

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

于 2015-08-20T18:25:35.953 に答える