2011-02-23 28 views
62

que tienen una base de datos que se creó con el juego de caracteres predeterminado SQL_ASCII. Quiero cambiarlo a UNICODE. ¿Hay una manera fácil de hacer eso?¿Cómo se cambia la codificación de caracteres de una base de datos postgres?

+1

Véase también http://stackoverflow.com/q/380924 – dsh

+1

posible duplicado de [¿Cómo puede cambio la codificación de la base de datos para una base de datos PostgreSQL usando sql o phpPgAdmin?] (http://stackoverflow.com/questions/380924/how-can-i-change-database-encoding-for-a-postgresql-database-using-sql -o-phppga) – l0b0

Respuesta

47

Para cambiar la codificación de la base de datos:

  1. un volcado de la base de datos
  2. Caída de su base de datos,
  3. Crear nueva base de datos con la codificación diferente
  4. volver a cargar los 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

+0

En lo que no obtengo del enlace es "Compruebe si el archivo de volcado creado en el primer paso tiene caracteres especiales y realice los cambios necesarios" => ¿Tengo que cambiar manualmente todos los cha especiales? racters – spankmaster79

73

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 empujar el catálogo pg_database reasignar la codificación de la base de datos. Esto supone que ya ha almacenado todos los caracteres no ASCII en la codificación esperada (o que simplemente no han utilizado todos los caracteres no ASCII).

A continuación, puede hacer:

update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = 'thedb' 

Esto no va a cambiar la intercalación de la base de datos, cómo los bytes codificados se convierten en caracteres (por lo que ahora length('£123') volverán 4 en vez 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.

+1

+1 Gracias. Mi máquina dev usa codificación UTF8, pero mi producción usa LATIN1. Estaba teniendo muchos errores debido a esto. –

+1

Me está dando este error: '-bash: error de sintaxis cerca del token inesperado' ('' –

8

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. codificación de datos se debe establecer antes de los datos se inserta en la base de datos.

Comprobar this: Al copiar cualquier otra base de datos, la codificación y la configuración regional no se puede cambiar a los de la base de datos fuente, porque eso podría resultar en datos corruptos.

Y this: Algunas categorías de localización 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 fija o índices en columnas de texto habría corrompido. (Pero puede aliviar esta restricción utilizando colaciones, como se describe 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 Comando CREATE DATABASE.


yo preferiría reconstruir todo desde el principio correctamente con una codificación local correcta de su sistema operativo Debian como se explica here:

su root 

volver a configurar los ajustes locales:

dpkg-reconfigure locales 

Elige su localidad (como por ejemplo para el francés en Suiza: fr_CH.UTF8)

desinstalar y limpia adecuadamente 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 automáticamente se puede crear con la codificación correcta, LC_TYPE (clasificación de caracteres), y LC_COLLATE (orden de clasificación de cadena). La respuesta de

+2

Creo que es "dpkg-reconfigure locales", en plural. La forma singular no parece funcionar (simplemente marcada). – foo

+0

tx, enmendé esta corrección :) – Douglas

5

Daniel Kutik es correcta, pero puede ser aún más seguro, con el cambio de nombre de base de datos .

Por lo tanto, la forma verdaderamente seguro es:

  1. Crear nueva base de datos con la codificación diferente y el nombre
  2. un volcado de la base de datos
  3. Restaurar volcado a la nueva base de datos
  4. de prueba que se ejecuta la aplicación correctamente con el nuevo DB
  5. Renombrar DB antiguo a algo significativo
  6. Renombrar nuevo DB
  7. aplicación
  8. prueba de nuevo
  9. La caída de la antigua base de datos

En caso de emergencia, simplemente cambiar el nombre de DB volver

Cuestiones relacionadas