Buen día. estamos trabajando con la versión 3.18.1 y un usuario nos reportó el siguiente problema; cuando quiere acceder a un plan de estudios desde la operación “Administrar planes de estudios” le sale el siguiente mensaje:
SQLSTATE: db_22P05
CODIGO: 7
MENSAJE: ERROR: carácter con secuencia de bytes 0xe2 0x80 0x9c en codificación «UTF8» no tiene equivalente en la codificación «LATIN1»
SQL: SELECT get_plan_contenido.elemento,\n get_plan_contenido.entidad_tipo,\n get_plan_contenido.entidad_subtipo,\n get_plan_contenido.entidad_clase_gui as elemento_clase_gui,\n get_plan_contenido.elemento_padre,\n get_plan_contenido.codigo,\n get_plan_contenido.nombre,\n get_plan_contenido.elemento_revision,\n get_plan_contenido.elemento_comp,\n get_plan_contenido.orden\n \n FROM get_plan_contenido(“1107”)\n JOIN sga_g3entidades_subtipos ON (get_plan_contenido.entidad_subtipo = sga_g3entidades_subtipos.entidad_subtipo)\n \n WHERE true – toba_log: 6514846
Se trata de un inconveniente con el encoding de alguno de los datos que retorna la consulta SQL: en la BD se ingresó un caractér UTF8 que no se puede representar en LATIN1.
Por defecto las bases de datos PostgreSQL están en UTF8 y Guaraní trabaja en LATIN1. Cuando se establece la conexión, Guaraní indica a la BD que quiere trabajar con el encoding LATIN1 y el motor se encarga de convertir entre uno y otro.
Este error puede surgir cuando cargan datos directamente sobre la BD, sin utilizar el sistema.
Se me ocurre que revisen los elementos del plan-versión 107 para ver si encuentran algún caracter extraño en el nombre (columnas ‘nombre’, ‘nombre_abreviado’ de las tablas ‘sga_elementos’ o ‘sga_elementos_plan’).
Prueben desde un editor sql lo siguiente:
SET CLIENT_ENCODING TO 'LATIN1';
SELECT nombre, nombre_abreviado FROM sga_elementos_plan;
Si tienen algun caracter no soportado en LATIN1 va a mostrar un mensaje como el siguiente:
‘utf-8’ codec can’t decode byte 0xf3 in position 10: invalid continuation byte
Se puede crear la siguiente función en Postgres y con la misma buscar registros que no sean LATIN1/iso-8859-1:
CREATE OR REPLACE FUNCTION is_latin(input text)
RETURNS boolean
LANGUAGE plpgsql
IMMUTABLE
AS $$
BEGIN
PERFORM convert_to(input, 'iso-8859-15');
RETURN true;
EXCEPTION
WHEN untranslatable_character THEN
RETURN false;
END;
$$;
SELECT nombre, nombre_abreviado FROM sga_elementos_plan WHERE NOT is_latin(nombre);