Tengo una base de datos que se configuró con el juego de caracteres predeterminado SQL_ASCII. Quiero cambiarlo a UNICODE. ¿Existe una forma sencilla de hacerlo?
Tengo una base de datos que se configuró con el juego de caracteres predeterminado SQL_ASCII. Quiero cambiarlo a UNICODE. ¿Existe una forma sencilla de hacerlo?
Respuestas:
Para cambiar la codificación de su base de datos:
Asegúrese de que la codificación del cliente esté configurada correctamente durante todo esto.
Fuente: http://archives.postgresql.org/pgsql-novice/2006-03/msg00210.php
sudo -u postgres pg_dump your_db > /backups/postgresql.sql
...
En primer lugar, la respuesta de Daniel es la opción correcta y segura.
Para el caso específico de cambiar de SQL_ASCII a otra cosa, puede hacer trampa y simplemente pinchar el catálogo pg_database para reasignar la codificación de la base de datos. Esto supone que ya ha almacenado cualquier carácter que no sea ASCII en la codificación esperada (o que simplemente no ha utilizado ningún carácter que no sea ASCII).
Entonces puedes hacer:
update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = 'thedb'
Esto no cambiará la clasificación de la base de datos, solo cómo los bytes codificados se convierten en caracteres (por lo que ahora length('£123')
devolverá 4 en lugar de 5). Si la base de datos utiliza la intercalación 'C', no debería haber ningún cambio en el orden de las cadenas ASCII. Sin embargo, es probable que deba reconstruir cualquier índice que contenga caracteres no ASCII.
Caveat emptor. El volcado y la recarga proporcionan una forma de verificar que el contenido de su base de datos esté realmente en la codificación que espera, y esto no es así. Y si resulta que tenía algunos datos codificados incorrectamente en la base de datos, el rescate será difícil. Entonces, si puede, descargue y reinicialice.
-bash: syntax error near unexpected token
(''
psql
indicador.
Volcar una base de datos con una codificación específica e intentar restaurarla en otra base de datos con una codificación diferente podría resultar en corrupción de datos. La codificación de datos debe establecerse ANTES de que se inserten datos en la base de datos.
Verifique esto : al copiar cualquier otra base de datos, la codificación y la configuración regional no se pueden cambiar de las de la base de datos de origen, porque eso podría resultar en datos corruptos.
Y esto : algunas categorías de configuración regional deben tener sus valores fijos cuando se crea la base de datos. Puede usar diferentes configuraciones para diferentes bases de datos, pero una vez que se crea una base de datos, ya no puede cambiarlas para esa base de datos. LC_COLLATE y LC_CTYPE son estas categorías. Afectan el orden de clasificación de los índices, por lo que deben mantenerse fijos o los índices de las columnas de texto se dañarían. ( Pero puede aliviar esta restricción usando intercalaciones, como se discutió en la Sección 22.2. ) Los valores predeterminados para estas categorías se determinan cuando se ejecuta initdb, y esos valores se usan cuando se crean nuevas bases de datos, a menos que se especifique lo contrario en el comando CREATE DATABASE.
Preferiría reconstruir todo desde el principio correctamente con una codificación local correcta en su sistema operativo Debian como se explica aquí :
su root
Reconfigure su configuración local:
dpkg-reconfigure locales
Elija su localidad (como por ejemplo para francés en Suiza: fr_CH.UTF8)
Desinstale y limpie correctamente postgresql:
apt-get --purge remove postgresql\*
rm -r /etc/postgresql/
rm -r /etc/postgresql-common/
rm -r /var/lib/postgresql/
userdel -r postgres
groupdel postgres
Vuelva a instalar postgresql:
aptitude install postgresql-9.1 postgresql-contrib-9.1 postgresql-doc-9.1
Ahora, cualquier nueva base de datos se creará automáticamente con la codificación correcta, LC_TYPE (clasificación de caracteres) y LC_COLLATE (orden de clasificación de cadenas).
La respuesta de Daniel Kutik es correcta, pero puede ser aún más segura con el cambio de nombre de la base de datos .
Entonces, la forma verdaderamente segura es:
En caso de emergencia, simplemente cambie el nombre de las bases de datos.
# dump into file
pg_dump myDB > /tmp/myDB.sql
# create an empty db with the right encoding (on older versions the escaped single quotes are needed!)
psql -c 'CREATE DATABASE "tempDB" WITH OWNER = "myself" LC_COLLATE = '\''de_DE.utf8'\'' TEMPLATE template0;'
# import in the new DB
psql -d tempDB -1 -f /tmp/myDB.sql
# rename databases
psql -c 'ALTER DATABASE "myDB" RENAME TO "myDB_wrong_encoding";'
psql -c 'ALTER DATABASE "tempDB" RENAME TO "myDB";'
# see the result
psql myDB -c "SHOW LC_COLLATE"