SQLまたはphpPgAdminを使用して、PostgreSQLデータベースのデータベースエンコーディングを変更するにはどうすればよいですか?
つまり、phpPgAdminまたはSQLだけでは既存のデータ破損のリスクを冒すことなくこれを行うことはできません。すべてのデータをエクスポートし、正しいエンコードでデータベースを作成し、エクスポートしたデータを復元する必要があります。
これはあなたが続行する方法です:
データベースダンプの作成:
pg_dump your_database > your_database.sql
これにより、現在使用しているエンコーディングで、データベースがSQL形式で保存されます。
データベースを削除(または名前を変更):
DROP DATABASE your_database
それを行うのに十分なストレージがある場合は、新しいデータベースですべてが問題ないことを確認するまで、古いデータベースを残しておくことをお勧めしますrename it:
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クライアントエンコーディングを設定する必要があります。
オンザフライでエンコーディングを変更することはできません。これは、内部データベースデータのほとんどを書き換える必要があるためです。これは、私が説明したデータベースの再作成とほぼ同じです。
データベースに関する内部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