PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 29/11/2017 12:33:30

mortimer.pw
Membre

Invalid byte sequence for encoding "UTF8"

Bonjour,
Je découvre PgAdmin 4. Version2.0. Python Version2.7.13. Flask Version0.12.2. Application ModeDesktop, sous Windows 7 Pro.
J'accède à une base 10.1 sous Linux.
J'ai le message d'erreur donné en titre lorsque je veux visualiser la description de certaines tables (clic sur la table, Onglet SQL).
J'ai cherché un peu sur la toile, sans succès.
Mon Serveur Encoding est UTF8
Mon Client Encoding est UNICODE
Ma base est en UTF8
Dans mon postgresql.conf, j'ai escape_string_warning = off et standard_conforming_strings = off
Si quelqu'un peut m'aider.
J'ai également cette erreur dans les logs : 2017-11-29 11:25:27 CET [22730]
: [2301-1] user=postgres 192.168.71.18 2017-11-29 10:08:41 CET ERROR: invalid byte sequence for encoding "UTF8": 0x00 : [2302-1] user=postgres 192.168.71.18 2017-11-29 10:08:41 CET
STATEMENT: SELECT t.oid,t.tgname AS name, t.xmin, t.*, relname, CASE WHEN relkind = 'r' THEN TRUE ELSE FALSE END AS parentistable, nspname, des.description, l.lanname, p.prosrc, p.proname AS tfunction, COALESCE(substring(pg_get_triggerdef(t.oid), 'WHEN (.*) EXECUTE PROCEDURE'), substring(pg_get_triggerdef(t.oid), 'WHEN (.*) \\$trigger')) AS whenclause, -- We need to convert tgargs column bytea datatype to array datatype (string_to_array(encode(tgargs, 'escape'), '\000')::text[])[1:tgnargs] AS custom_tgargs, (CASE WHEN t.oid <= 13157::oid THEN true ElSE false END) AS is_sys_trigger, (CASE WHEN tgconstraint != 0::OID THEN true ElSE false END) AS is_constarint, (CASE WHEN tgenabled = 'O' THEN true ElSE false END) AS is_enable_trigger FROM pg_trigger t JOIN pg_class cl ON cl.oid=tgrelid JOIN pg_namespace na ON n [LINE TRUNCATED, original was 1,296 characters long]

Dernière modification par mortimer.pw (29/11/2017 12:35:58)

Hors ligne

#2 29/11/2017 19:26:41

gleu
Administrateur

Re : Invalid byte sequence for encoding "UTF8"

Apparemment, PostgreSQL a récupéré un octet nul, ce qui ne devrait jamais arriver dans un champ texte. Difficile d'aller plus loin sans avoir accès au serveur, mais en tout cas, ça ne semble pas bon du tout.


Guillaume.

Hors ligne

#3 30/11/2017 08:27:42

mortimer.pw
Membre

Re : Invalid byte sequence for encoding "UTF8"

Bonjour Guillaume,
Pour valider que ce n'est pas lié à mon instance 10.1 toute fraîche, j'ai le même problème sur d'autres bases sur d'autres serveurs.

Hors ligne

#4 02/12/2017 09:23:51

gleu
Administrateur

Re : Invalid byte sequence for encoding "UTF8"

Avez-vous essayé de faire la même requête dans psql ? histoire de savoir si le problème vient de pgAdmin ou de postgres...


Guillaume.

Hors ligne

#5 06/12/2017 08:10:35

mortimer.pw
Membre

Re : Invalid byte sequence for encoding "UTF8"

Bonjour Guillaume,

Même problème sous PSQL, sur différents serveurs.

[postgres@dev-indusbdd-01 pg_log]$ psql geo
psql (10.1)
Type "help" for help.

geo=# SELECT t.oid,t.tgname AS name, t.xmin, t.*, relname, CASE WHEN relkind = 'r' THEN TRUE ELSE FALSE END AS parentistable,nspname, des.description, l.lanname, p.prosrc, p.proname AS tfunction,COALESCE(substring(pg_get_triggerdef(t.oid), 'WHEN (.*) EXECUTE PROCEDURE'),substring(pg_get_triggerdef(t.oid), 'WHEN (.*)  \\$trigger')) AS whenclause,(string_to_array(encode(tgargs, 'escape'), '\000')::text[])[1:tgnargs] AS custom_tgargs,(CASE WHEN t.oid <= 13157::oid THEN true ElSE false END) AS is_sys_trigger,(CASE WHEN tgconstraint != 0::OID THEN true ElSE false END) AS is_constarint,(CASE WHEN tgenabled = 'O' THEN true ElSE false END) AS is_enable_trigger
geo-# FROM pg_trigger t JOIN pg_class cl ON cl.oid=tgrelid JOIN pg_namespace na ON na.oid=relnamespace LEFT OUTER JOIN pg_description des ON (des.objoid=t.oid AND des.classoid='pg_trigger'::regclass) LEFT OUTER JOIN pg_proc p ON p.oid=t.tgfoid LEFT OUTER JOIN pg_language l ON l.oid=p.prolang
geo-# WHERE NOT tgisinternal AND tgrelid = 16753::OID AND t.oid = 18113::OID
geo-# ORDER BY tgname;
ERROR:  invalid byte sequence for encoding "UTF8": 0x00
geo=# \q

Je suis tombé sur un post qui parle du même sujet mais je ne vois pas de solution : https://www.postgresql.org/message-id/A … ebates.com

Ci-dessous la description d'une table sur laquelle le problème se pose :

CREATE TABLE activite
(
  id_cgu character varying(20) NOT NULL,
  id_site character varying(20) NOT NULL,
  id_ligne character varying(4) NOT NULL,
  id_plan character varying(4) NOT NULL,
  id_fonction character varying(4) NOT NULL,
  id_operation character varying(5) NOT NULL,
  id_type_ptg numeric NOT NULL,
  id_type_act character varying(3) NOT NULL,
  tps_gam numeric(7,4) DEFAULT 0,
  tps_gam_test numeric(7,4) DEFAULT 0,
  id_type_coq character varying(3) NOT NULL,
  id_type_qte_act numeric NOT NULL DEFAULT 0,
  qte_igeo boolean NOT NULL DEFAULT false,
  id_alim_document numeric NOT NULL DEFAULT 0,
  id_type_cum_doc numeric NOT NULL DEFAULT 1,
  sum_quantite boolean NOT NULL DEFAULT true,
  id_methode_qt numeric NOT NULL DEFAULT 0,
  lfo_cgu character(12),
  date_fin date NOT NULL DEFAULT to_date('30000101'::text, 'YYYYMMDD'::text),
  CONSTRAINT pk_activite PRIMARY KEY (id_cgu, id_site, id_ligne, id_plan, id_fonction, id_operation, date_fin),
  CONSTRAINT fk_activite_alim_document FOREIGN KEY (id_alim_document)
      REFERENCES alim_document (id_alim_document) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk_activite_cgu FOREIGN KEY (id_cgu)
      REFERENCES cgu (id_cgu) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk_activite_fonction FOREIGN KEY (id_cgu, id_fonction)
      REFERENCES fonction (id_cgu, id_fonction) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk_activite_ligne FOREIGN KEY (id_cgu, id_ligne)
      REFERENCES ligne (id_cgu, id_ligne) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk_activite_methode_qt FOREIGN KEY (id_methode_qt)
      REFERENCES methode_qt (id_methode_qt) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk_activite_operation FOREIGN KEY (id_cgu, id_operation)
      REFERENCES operation (id_cgu, id_operation) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk_activite_plan FOREIGN KEY (id_cgu, id_plan)
      REFERENCES plan (id_cgu, id_plan) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk_activite_site FOREIGN KEY (id_cgu, id_site)
      REFERENCES site (id_cgu, id_site) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk_activite_type_act FOREIGN KEY (id_type_act)
      REFERENCES type_act (id_type_act) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk_activite_type_coq FOREIGN KEY (id_type_coq)
      REFERENCES type_coq (id_type_coq) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk_activite_type_cum_doc FOREIGN KEY (id_type_cum_doc)
      REFERENCES type_cum_doc (id_type_cum_doc) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk_activite_type_ptg FOREIGN KEY (id_type_ptg)
      REFERENCES type_ptg (id_type_ptg) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk_activite_type_qte_act FOREIGN KEY (id_cgu, id_type_qte_act)
      REFERENCES type_qte_act (id_cgu, id_type_qte_act) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
  OIDS=FALSE
);
ALTER TABLE activite
  OWNER TO postgres;
GRANT ALL ON TABLE activite TO postgres;
GRANT SELECT ON TABLE activite TO basic_geo;
GRANT UPDATE, INSERT ON TABLE activite TO maj_geo;
GRANT DELETE ON TABLE activite TO adm_geo;
GRANT UPDATE, INSERT, DELETE ON TABLE activite TO maj_console;

CREATE INDEX activite_lpfo
  ON activite
  USING btree
  (id_ligne COLLATE pg_catalog."default", id_plan COLLATE pg_catalog."default", id_fonction COLLATE pg_catalog."default", id_operation COLLATE pg_catalog."default");

CREATE INDEX activite_sc
  ON activite
  USING btree
  (id_site COLLATE pg_catalog."default", id_cgu COLLATE pg_catalog."default");

CREATE TRIGGER jt_activite
  AFTER INSERT OR UPDATE OR DELETE
  ON activite
  FOR EACH ROW
  EXECUTE PROCEDURE j_geo.jf_recharge_activite();

CREATE OR REPLACE FUNCTION j_geo.jf_recharge_activite()
  RETURNS trigger AS
$BODY$
DECLARE
BEGIN
    IF tg_op = 'DELETE' THEN
        INSERT INTO j_geo.j_recharge_activite(id_abonne,j_consumed,j_flag,j_date,id_cgu,id_site)
        SELECT id_abonne,'0','D',NOW(),OLD.id_cgu,OLD.id_site FROM jrn_center.jrn_abonnes WHERE j_tname='geo.activite' AND j_start=TRUE and (filter_1=OLD.id_cgu or filter_1='*') and (filter_2=OLD.id_site or filter_2='*');       
    ELSE
        INSERT INTO j_geo.j_recharge_activite(id_abonne,j_consumed,j_flag,j_date,id_cgu,id_site)
        SELECT id_abonne,'0','I',NOW(),NEW.id_cgu,NEW.id_site FROM jrn_center.jrn_abonnes WHERE j_tname='geo.activite' AND j_start=TRUE and (filter_1=NEW.id_cgu or filter_1='*') and (filter_2=NEW.id_site or filter_2='*');   
    END IF;
    RETURN NULL;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION j_geo.jf_recharge_activite()
  OWNER TO postgres;
GRANT EXECUTE ON FUNCTION j_geo.jf_recharge_activite() TO postgres;
GRANT EXECUTE ON FUNCTION j_geo.jf_recharge_activite() TO basic_jgeo;
REVOKE ALL ON FUNCTION j_geo.jf_recharge_activite() FROM public;

Dernière modification par mortimer.pw (06/12/2017 08:33:27)

Hors ligne

#6 07/12/2017 00:43:55

gleu
Administrateur

Re : Invalid byte sequence for encoding "UTF8"

J'ai essayé avec une modif des requêtes ci-dessus mais, pour moi, ça marche.


Guillaume.

Hors ligne

#7 07/12/2017 09:11:31

mortimer.pw
Membre

Re : Invalid byte sequence for encoding "UTF8"

Bonjour Guillaume,

Avec la même config "Serveur Encoding", "Client Encoding" et base de données ?
J'ai le même problème avec plusieurs serveurs.
Dans quelle direction faut-il creuser ?

Hors ligne

#8 07/12/2017 15:27:27

gleu
Administrateur

Re : Invalid byte sequence for encoding "UTF8"

Avec quelque chose qui y ressemble, vu qu'il n'y a pas un jeu de tests réel et fonctionnel. Quant à une direction dans laquelle creuser, aucune idée.


Guillaume.

Hors ligne

#9 08/12/2017 09:34:26

mortimer.pw
Membre

Re : Invalid byte sequence for encoding "UTF8"

Bonjour Guillaume,
Visiblement nous avons l'erreur sur les tables qui ont des trigger.
Y-a-t'il un support pour PgAdmin IV ?
Il faut trouver une solution si PgAdmin III n'évolue plus.
Merci.

Dernière modification par mortimer.pw (08/12/2017 10:39:03)

Hors ligne

#10 08/12/2017 17:02:08

gleu
Administrateur

Re : Invalid byte sequence for encoding "UTF8"

Il existe toujours la liste de discussion pgadmin-support.


Guillaume.

Hors ligne

#11 17/01/2018 09:18:13

mortimer.pw
Membre

Re : Invalid byte sequence for encoding "UTF8"

Bonjour,

Je reviens vers vous car pas de réponse de PgAdmin-Support.

J'ai fait d'autres tests (je suis passé à PgAdmin 4 version 2.1, toujours sous windows 7 64 Bits).

Script de création de la base :
     CREATE DATABASE geo
    WITH
    OWNER = postgres
    ENCODING = 'UTF8'
    LC_COLLATE = 'fr_FR.UTF-8'
    LC_CTYPE = 'fr_FR.UTF-8'
    TABLESPACE = pg_default
    CONNECTION LIMIT = -1;

Script de création de table :
     CREATE TABLE geo.activite
(
  id_cgu character varying(20) NOT NULL,
  id_site character varying(20) NOT NULL,
  id_ligne character varying(4) NOT NULL,
  id_plan character varying(4) NOT NULL,
  id_fonction character varying(4) NOT NULL,
  id_operation character varying(5) NOT NULL,
  id_type_ptg numeric NOT NULL,
  id_type_act character varying(3) NOT NULL,
  tps_gam numeric(7,4) DEFAULT 0,
  tps_gam_test numeric(7,4) DEFAULT 0,
  id_type_coq character varying(3) NOT NULL,
  id_type_qte_act numeric NOT NULL DEFAULT 0,
  qte_igeo boolean NOT NULL DEFAULT false,
  id_alim_document numeric NOT NULL DEFAULT 0,
  id_type_cum_doc numeric NOT NULL DEFAULT 1,
  sum_quantite boolean NOT NULL DEFAULT true,
  id_methode_qt numeric NOT NULL DEFAULT 0,
  lfo_cgu character(12),
  date_fin date NOT NULL DEFAULT to_date('30000101'::text, 'YYYYMMDD'::text),
  CONSTRAINT pk_activite PRIMARY KEY (id_cgu, id_site, id_ligne, id_plan, id_fonction, id_operation, date_fin))
WITH (OIDS=FALSE);
ALTER TABLE geo.activite OWNER TO postgres;

Script de création d'une fonction trigger (volontairement vidée) :
     CREATE OR REPLACE FUNCTION geo.jf_recharge_activite() RETURNS trigger AS
$BODY$
DECLARE
BEGIN
    RETURN NULL;
END;
$BODY$ LANGUAGE plpgsql VOLATILE COST 100;
ALTER FUNCTION geo.jf_recharge_activite() OWNER TO postgres;

Script de création d'un Trigger sur la table :
     CREATE TRIGGER jt_activite AFTER INSERT OR UPDATE OR DELETE ON geo.activite FOR EACH ROW EXECUTE PROCEDURE geo.jf_recharge_activite();

Test avec une base en 10.1 directement sur mon P.C, pas de problème.

Test avec une base en 10.1 sous Cent OS 7, toujours le problème.
Lorsque j'essaye à nouveau de visualiser la définition de ma table (onglet SQL), le message d'erreur est reproduit.
C'est vraiment après ajout du trigger.

Pouvez-vous m'aider svp ?

Dernière modification par mortimer.pw (17/01/2018 10:42:00)

Hors ligne

#12 17/01/2018 22:34:26

gleu
Administrateur

Re : Invalid byte sequence for encoding "UTF8"

J'ai testé de mon côté, pgAdmin 2.0, Fedora 27, aucun soucis.

Il serait intéressant de minimiser le cas. Par exemple, ne pas créer une table de tant de colonnes, mais une table avec une seul colonne, pas de contraintes, etc, histoire d'avoir un cas vraiment basique. De même, pas de schéma particulier. Etc. Le cas de tests le plus simple (mais pour lequel le problème se produit toujours).


Guillaume.

Hors ligne

#13 18/01/2018 08:35:59

mortimer.pw
Membre

Re : Invalid byte sequence for encoding "UTF8"

Bonjour Guillaume,
J'ai simplifié.
Création d'une BD :
CREATE DATABASE geo2 WITH OWNER = postgres TEMPLATE = template1 ENCODING = 'UTF8' CONNECTION LIMIT = -1;
Création d'une Table dans le schéma PUBLIC :
CREATE TABLE activite (id_cgu character varying(20) NOT NULL) WITH (OIDS=FALSE);
Je peux lire la définition de l'objet en cliquant sur l'onglet SQL.
Création de la Fonction Trigger :
CREATE OR REPLACE FUNCTION jf_recharge_activite() RETURNS trigger AS $BODY$ DECLARE BEGIN RETURN NULL; END;$BODY$ LANGUAGE plpgsql VOLATILE COST 100;
Création du Trigger :
CREATE TRIGGER jt_activite AFTER INSERT OR UPDATE OR DELETE ON activite FOR EACH ROW EXECUTE PROCEDURE jf_recharge_activite();
Toujours le même message d'erreur lors de la relecture de la définition de l'objet.

Hors ligne

#14 18/01/2018 09:22:37

gleu
Administrateur

Re : Invalid byte sequence for encoding "UTF8"

Toujours aucun soucis.


Guillaume.

Hors ligne

#15 18/01/2018 09:55:16

mortimer.pw
Membre

Re : Invalid byte sequence for encoding "UTF8"

Guillaume,
Même problème avec différents serveurs Cent-OS 6-7, PostgreSQL 9.3-9.4-10.1. Même avec une base vide.
Même problème sur le poste d'un collègue.
Problème de config ? d'environnement ?
Bon, me voilà bien embêté :-(

Hors ligne

#16 04/04/2018 23:41:35

alanlp
Membre

Re : Invalid byte sequence for encoding "UTF8"

J'ai eu le même problème...
Comme ma table ne contenait que des refs de clefs et un seul champ text, j'ai converti explicitement la valeur de mon champ en UTF 8 avant l'injection SQL, pour les curieux, en php mb_convert_encoding($content, "UTF-8").

cela a résolu mon problème.

Hors ligne

Pied de page des forums