Solución:
Parece que cualquier cliente que esté utilizando está confundido acerca de la codificación del texto; está enviando bytes utf-8 como si fueran latin-1, probablemente.
Cheque:
SHOW client_encoding;
SHOW server_encoding;
-
locale
comando en su terminal, si usapsql
Tu update
está sustituyendo los bytes octales 303244
que son la codificación utf-8 para “ä” (U + 00E4). No está sustituyendo datos codificados en latin-1 donde cree que está.
Observar:
regress=> SELECT convert_from(BYTEA 'huvudv303244rke', 'latin-1');
convert_from
--------------
huvudvärke
(1 row)
regress=> SELECT convert_from(BYTEA 'huvudv303244rke', 'utf-8');
convert_from
--------------
huvudvärke
(1 row)
No solo eso, sino tu replace
solo podría haber coincidido en primer lugar si el objetivo de reemplazo fuera el utf-8 codificado secuencia de bytes para ä
interpretado como latin-1, es decir 303203302244
.
Es difícil ser más específico sin detalles sobre la versión de Pg, el cliente que se está utilizando, etc., pero la causa principal es claramente que su cliente está haciendo algo totalmente complicado con codificaciones en E / S.
Tu texto original está totalmente destrozado, no es válido en UTF-8 o latin-1. Parece que alguien tomó algunos datos UTF-8, los descodificó como latin-1 y luego los codificó como utf-8 nuevamente.
Sí, bastante seguro:
regress=> SELECT convert(convert_to('huvudvärke', 'utf-8'), 'latin-1', 'utf-8');
convert
---------------------------
huvudv303203302244rke
(1 row)
ahí está tu explicación.
Yo diría que probablemente ya tiene un montón de datos mal codificados en la base de datos, y se dio cuenta de este porque se estropeó dos veces. Probablemente esté haciendo algo como bloquear rutinariamente utf-8 bytes en campos codificados en latin-1, pero generalmente se sale con la suya porque los decodifica como utf-8 nuevamente, y esta vez hizo algo diferente.
Si desea pasar de su texto destrozado al original, simplemente tiene que revertir el proceso de codificación incorrecto. Decodifica el utf-8 y genera latin-1, luego vuelve a interpretar el latin-1 como utf-8 y decodifica nuevamente, por ejemplo:
regress=> SELECT convert_from(convert(BYTEA 'huvudv303203302244rke', 'utf-8', 'latin-1'), 'utf-8');
convert_from
--------------
huvudvärke
(1 row)