Muchas gracias a ambos, la solución que me dan funciona perfectamente. Saludos, M.Sc. Esneiker Enriquez Cabrera Esp. B en Ciencias Informáticas Desoft en Ciego de Ávila. Joaquín de Aguero esq. Calle 2. Ciego de Ávila. Cuba. Telf.: 53 33 22 8971, email.: eenriq...@cav.desoft.cu
-----Mensaje original----- De: Anthony Sotolongo [mailto:asotolo...@gmail.com] Enviado el: viernes, 13 de noviembre de 2015 12:16 Para: Francisco Olarte; Esneiker Enriquez Cabrera CC: Lista Postgres ES Asunto: Re: [pgsql-es-ayuda] problema con codificacion Hola, asegurarte de tener el SET CLIENT_ENCODING TO 'UTF8', pues a veces un cliente de un tipo de codificación y el servidor de otra puede traer sus problemas y lo que te comenta Fransico funciona: select convert_from(decrypt(encrypt('telefónico','password','3dES'),'password','3dES'::text), 'UTF-8'); convert_from -------------- telefónico (1 row) El 13/11/15 a las 14:05, Francisco Olarte escribió: > 2015-11-13 21:53 GMT+01:00 Esneiker Enriquez Cabrera > <eenriq...@cav.desoft.cu>: >> Escribo porque estoy probando guardar información encriptada en la >> base de datos con codificación utf8 y todo resulta bien, excepto >> cuando la información tiene caracteres especiales, se guarda basura. >> A continuación les pongo un ejemplo. >> select >> encode(decrypt(encrypt('telefónico','password','3des'),'password','3d >> es'::text), >> 'escape'::text); >> el resultado que me retorna es “telef\303\263nico”, en lugar de telefónico. >> Espero que me puedan indicar cómo hacer el tratamiento correcto. > Esto huele a lo de siempre, UTF-8 es una forma de codificar texto en > bytes, la criptografia va en bytes, tenemos el encoding de la base de > datos por un lado, nos hemos liado.etc etc... > > No te lo puedo asegurar, pero el hecho de que necesites encode ya te > da una pista. Encrypt toma bytea como datos, PEEERO, tu le has dado un > texto fiandote de la conversion por defecto, decrypt devuelve bytea. > Luego coges y le dices que te lo imprima en escape, y lo hace bien, de > hecho : > > cdrs=> show client_encoding; > client_encoding > ----------------- > UTF8 > (1 row) > > cdrs=> select encode('telefónico', 'escape'); > encode > ------------------- > telef\303\263nico > (1 row) > > El problema es que el decrypt/encrypt es el equivalente a pasat > telefónico a bytea: > > > cdrs=> select 'telefónico'::bytea; > bytea > -------------------------- > \x74656c6566c3b36e69636f > (1 row) > > cdrs=> select encode('telefónico'::bytea, 'escape'); > encode > ------------------- > telef\303\263nico > (1 row) > > Y lo que tu quieres es que te interprete esos bytes como utf8, no que > te los imprima escapados, para eso necesitarias una funcion de > conversion de bytes a string, como por ejemplo: > > cdrs=> select convert_from('telefónico'::bytea, 'UTF-8'); > convert_from > -------------- > telefónico > (1 row) > > No te lo puedo probar porque no tengo instaladas las crypto, pero > juraria que es eso. > > Por cierto, si lo es tu codigo tiene un problema, que dejas la > conversion de texto a bytea a merced del encoding de la conexion y > otroas cosas, lo que no es recomendable, particularmente en > criptografia. Probablement tus problemas vienen de que la conversion > no es reversible: > > > cdrs=> select 'telefónico'::bytea::text; > text > -------------------------- > \x74656c6566c3b36e69636f > (1 row) > > Las cosas te iran mejor/mas simples, si al igual que apareas > encrypt/decrypt haces lo mismo con convert_from, convert_to, asi te > aseguras de que lo hace en el encoding que tu le dices > independientemente de la conexion: > > cdrs=> select convert_from(convert_to('telefónico','UTF-8'), 'UTF-8'); > convert_from > -------------- > telefónico > (1 row) > > Que funciona con otros encoding ( que soporten los caracteres que usas ): > > cdrs=> select convert_from(convert_to('telefónico','LATIN-1'), 'LATIN-1'); > convert_from > -------------- > telefónico > (1 row) > > A pesar de que: > > > > cdrs=> values(convert_to('telefónico','LATIN-1'), 'LATIN-1') union > values(convert_to('telefónico','UTF-8'), 'UTF-8'); > column1 | column2 > --------------------------+--------- > \x74656c6566c3b36e69636f | UTF-8 > \x74656c6566f36e69636f | LATIN-1 > (2 rows) > > Si haces esto se ve la simetria, > select(convert_from(decrypt(encrypt(convert_to...... no te fies nunca > de las conversiones por defecto cuando estas usando bytea, siempre se > revuelven y te muerden donde menos lo esperas. > > > > Saludos. > Francisco Olarte. > > - > Enviado a la lista de correo pgsql-es-ayuda > (pgsql-es-ayuda@postgresql.org) Para cambiar tu suscripci n: > http://www.postgresql.org/mailpref/pgsql-es-ayuda - Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org) Para cambiar tu suscripci�n: http://www.postgresql.org/mailpref/pgsql-es-ayuda