sql または phpPgAdmin を使用して PostgreSQL データベースのデータベース エンコーディングを変更するにはどうすればよいですか?
3 に答える
つまり、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 情報を変更するだけで、この変更後の新しいデータは正しく保存されますが、既存のデータが破損する可能性があります。
ダンプ/復元せずにオンザフライでエンコーディングを変更できます。
update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = 'database_name'
与えられた答えを拡張するには、これらのコマンドを使用してタスクを実行できます。
// 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