funciona - postgresql español
¿Cómo se cambia la codificación de caracteres de una base de datos postgres? (4)
Tengo una base de datos que se configuró con el juego de caracteres predeterminado SQL_ASCII. Quiero cambiarlo a UNICODE. ¿Hay una manera fácil de hacer eso?
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 insertar el catálogo pg_database para reasignar la codificación de la base de datos. Esto supone que ya ha almacenado caracteres no 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 intercalación de la base de datos, solo cómo los bytes codificados se convierten en caracteres (por lo que ahora la length(''£123'')
devolverá 4 en lugar de 5). Si la base de datos utiliza la intercalación ''C'', no debería haber cambios en el orden de las cadenas ASCII. Sin embargo, es probable que necesite reconstruir cualquier índice que contenga caracteres que no sean 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 tiene algunos datos codificados incorrectamente en la base de datos, el rescate será difícil. Entonces, si puedes, puedes volcar y reiniciar.
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 manera verdaderamente segura es:
- Crear una nueva base de datos con la codificación y el nombre diferentes
- Vuelca tu base de datos
- Restaurar volcado a la nueva base de datos
- Compruebe que su aplicación se ejecuta correctamente con la nueva base de datos
- Cambie el nombre del antiguo DB a algo significativo
- Renombrar nueva base de datos
- Aplicación de prueba de nuevo
- Suelta la vieja base de datos
En caso de emergencia, simplemente cambie el nombre de los DB
Para cambiar la codificación de su base de datos:
- Vuelca tu base de datos
- Deja tu base de datos
- Crear nueva base de datos con la codificación diferente
- Recarga tus 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
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 provocar daños en los datos. La codificación de datos se debe establecer ANTES de que se inserten datos en la base de datos.
Compruebe this : al copiar cualquier otra base de datos, la configuración de codificación y configuración regional no se puede cambiar desde la de la base de datos de origen, ya que podría dar lugar a datos corruptos.
Y this : algunas categorías locales 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 al orden de clasificación de los índices, por lo que deben mantenerse fijos o los índices en las columnas de texto se dañarán. ( Pero puede aliviar esta restricción utilizando colaciones, como se explica 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.
Prefiero reconstruir todo desde el principio correctamente con una codificación local correcta en su sistema operativo Debian como se explica here :
su root
Vuelva a configurar su configuración local:
dpkg-reconfigure locales
Elija su configuración regional (como por ejemplo para el francés en Suiza: fr_CH.UTF8)
Desinstalar y limpiar 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
Reinstalar postgresql:
aptitude install postgresql-9.1 postgresql-contrib-9.1 postgresql-doc-9.1
Ahora cualquier base de datos nueva se creará automáticamente con la codificación correcta, LC_TYPE (clasificación de caracteres) y LC_COLLATE (orden de clasificación de cadenas).