Comment puis-je changer l'encodage de base de données pour une base de données PostgreSQL en utilisant sql ou phpPgAdmin?

Comment puis-je changer l'encodage de base de données pour une base de données PostgreSQL en utilisant sql ou phpPgAdmin?

27
demandé sur peterh 2008-12-19 16:11:55

3 réponses

En bref, vous ne pouvez pas le faire avec seulement phpPgAdmin ou SQL sans risquer la corruption de données existantes . Vous devez exporter toutes les données, créer une base de données avec un codage correct et restaurer les données exportées.

Voici comment vous devez procéder:

  1. Créer un vidage de base de données :

    pg_dump your_database > your_database.sql

    Cela permettra d'enregistrer votre base de données au format sql, dans l'encodage que vous avez actuellement.

  2. Supprimer la base de données (ou de le renommer):

    DROP DATABASE your_database

    Si vous avez assez de stockage pour le faire, je recommande de laisser l'ancienne base de données jusqu'à ce que vous vous assuriez que tout est OK avec la nouvelle, renommez it:

    ALTER DATABASE your_database RENAME TO your_database_backup;

  3. Créer une base de données avec un nouvel encodage :

    CREATE DATABASE your_database WITH ENCODING 'UNICODE' TEMPLATE=template0;

  4. Importer des données à partir d'un dump créé avant :

    PGCLIENTENCODING=YOUR_OLD_ENCODING psql -f your_database.sql your_database

    Vous devez définir l'encodage du client psql sur celui que vous aviez dans l'ancienne base de données.

Modification de l'encodage à la volée ce n'est pas possible car il faudrait réécrire la plupart des données de base de données internes, ce qui équivaut presque à recréer la base de données que j'ai décrite.

Il est possible de modifier simplement les informations internes de postgres sur la base de données et toutes les nouvelles données après cette modification seront enregistrées correctement, mais vos données existantes pourraient être corrompues .

43
répondu rombarcz 2017-09-08 12:18:55

Vous pouvez modifier l'encodage à la volée sans dump/restore:

update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = 'database_name'
15
répondu user1941407 2015-08-15 06:32:53

Pour développer les réponses données, vous pouvez utiliser ces commandes pour accomplir votre tâche.

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

Antidumping de base de données: http://www.postgresql.org/docs/9.4/static/backup-dump.html

Création de la base de données: http://www.postgresql.org/docs/9.4/static/sql-createdatabase.html

Ceci est une liste de tous les encodages disponibles pour la version 9.4: http://www.postgresql.org/docs/9.4/static/multibyte.html#MULTIBYTE-CHARSET-SUPPORTED

4
répondu Bobort 2015-08-20 18:25:35