From asseline at telecom-paristech.fr Tue Jun 14 20:44:46 2016 From: asseline at telecom-paristech.fr (Dominique Asselineau) Date: Tue, 14 Jun 2016 20:44:46 +0200 Subject: [Perl] =?iso-8859-1?q?passage_=E0_UTF-8?= Message-ID: <20160614184446.GA14668@telecom-paristech.fr> Bonjour, Je suis en train de passer en UTF-8 mes kilomètres de code Perl. J'ai parcouru pas mal de docs avant de me lancer mais je préférerais avoir votre avis, en tout cas celui de ceux qui ont réalisé l'opération avec succès, avant d'avancer davantage au risque de faire des mauvais choix. Naturellement, comme je n'ai pas envie d'agir au coup par coup par des encode/decode et :utf8 à chaque entrée/sortie, j'essaie de charger des modules qui permettent de traiter une grosse partie des cas. Est-ce que je m'y prends bien en mettant en en-tête de tous mes sources les lignes suivantes ? use Modern::Perl; use utf8; use feature qw/unicode_strings/; use CGI qw/:utf8/; et en utilisant l'option -C avec -COE sachant que ces scripts tournent dans un contexte CGI où le STDIN ne doit pas être altéré puisqu'on récupère les upload par cette voie. Et a priori je ne souhaite pas non plus que les entrées/sorties de fichier soient altérés par des encode/décode. Peut-être peut-on regrouper des choses mais par exemple, je n'ai pas remarqué que le module Modern::Perl comportait des options à propos de l'Unicode. Merci de vos commentaires. Dominique -- From perl at profvince.com Tue Jun 14 20:57:30 2016 From: perl at profvince.com (Vincent Pit (VPIT)) Date: Tue, 14 Jun 2016 20:57:30 +0200 Subject: [Perl] =?utf-8?q?passage_=C3=A0_UTF-8?= In-Reply-To: <20160614184446.GA14668@telecom-paristech.fr> References: <20160614184446.GA14668@telecom-paristech.fr> Message-ID: <6d5ebf4c-042c-52a7-e92b-c6b693a6529e@profvince.com> Le 14/06/2016 à 20:44, Dominique Asselineau a écrit : > Bonjour, > > Je suis en train de passer en UTF-8 Unicode > mes kilomètres de code Perl. J'ai > parcouru pas mal de docs avant de me lancer mais je préférerais avoir > votre avis, en tout cas celui de ceux qui ont réalisé l'opération avec > succès, avant d'avancer davantage au risque de faire des mauvais choix. > > Naturellement, comme je n'ai pas envie d'agir au coup par coup par des > encode/decode et :utf8 à chaque entrée/sortie, j'essaie de charger des > modules qui permettent de traiter une grosse partie des cas. C'est pourtant la bonne manière de faire. > > Est-ce que je m'y prends bien en mettant en en-tête de tous mes sources les lignes suivantes ? > > use Modern::Perl; Inutile. > use utf8; Utile si et seulement si ton fichier source est encodé en UTF-8. À n'utiliser que si tu as transcodé la source de l'encodage initial (latin1 j'imagine) vers UTF-8, par exemple avec iconv. > use feature qw/unicode_strings/; Bien, tant tu fais bien attention que tes regexp continuent de faire ce que tu attends d'elles. > use CGI qw/:utf8/; La doc CGI n'indique pas d'option :utf8, par contre il y a une option -utf8, qui semble t'être utile à première vue. > > et en utilisant l'option -C avec > > -COE Pas faux à proprement parler, mais mieux vaut appliquer manuellement la couche ':encoding(UTF-8)' sur STDOUT et STDERR via binmode (-COE doit être placé sur le shebang ce qui ne sera pas très lisible quand tu reviendras relire ton code dans 5 ans, et je crois qu'il est implémenté par la couche ':utf8' qui ne vérifie pas que les sorties sont bien encodées). > > sachant que ces scripts tournent dans un contexte CGI où le STDIN ne > doit pas être altéré puisqu'on récupère les upload par cette voie. Et > a priori je ne souhaite pas non plus que les entrées/sorties de > fichier soient altérés par des encode/décode. > > Peut-être peut-on regrouper des choses mais par exemple, je n'ai pas > remarqué que le module Modern::Perl comportait des options à propos de > l'Unicode. > > Merci de vos commentaires. > > Dominique > Vincent From asseline at telecom-paristech.fr Tue Jun 14 21:48:52 2016 From: asseline at telecom-paristech.fr (Dominique Asselineau) Date: Tue, 14 Jun 2016 21:48:52 +0200 Subject: [Perl] =?iso-8859-1?q?passage_=E0_UTF-8?= In-Reply-To: <6d5ebf4c-042c-52a7-e92b-c6b693a6529e@profvince.com> References: <20160614184446.GA14668@telecom-paristech.fr> <6d5ebf4c-042c-52a7-e92b-c6b693a6529e@profvince.com> Message-ID: <20160614194852.GC14668@telecom-paristech.fr> Vincent Pit (VPIT) wrote on Tue, Jun 14, 2016 at 08:57:30PM +0200 > > > Le 14/06/2016 à 20:44, Dominique Asselineau a écrit : > >Bonjour, > > > >Je suis en train de passer en UTF-8 > > Unicode Plus précis en effet. > > >mes kilomètres de code Perl. J'ai > >parcouru pas mal de docs avant de me lancer mais je préférerais avoir > >votre avis, en tout cas celui de ceux qui ont réalisé l'opération avec > >succès, avant d'avancer davantage au risque de faire des mauvais choix. > > > >Naturellement, comme je n'ai pas envie d'agir au coup par coup par des > >encode/decode et :utf8 à chaque entrée/sortie, j'essaie de charger des > >modules qui permettent de traiter une grosse partie des cas. > > C'est pourtant la bonne manière de faire. Pourquoi « pourtant » ? Les encode/decode au coup par coup ou les options et modules qui traitent globalement la chose ? > > > > >Est-ce que je m'y prends bien en mettant en en-tête de tous mes sources les lignes suivantes ? > > > > use Modern::Perl; > > Inutile. Pour l'Unicode oui, mais je ne travaille pas avec des déclarations implicites (à la PHP ou Python). Il me faut le « use strict » de toute manière, et le « use warnings » est bien pratique pour prévenir les problèmes. > > > use utf8; > > Utile si et seulement si ton fichier source est encodé en UTF-8. À > n'utiliser que si tu as transcodé la source de l'encodage initial (latin1 > j'imagine) vers UTF-8, par exemple avec iconv. Oui, c'est fait, j'avais oublié de le préciser. > > > use feature qw/unicode_strings/; > > Bien, tant tu fais bien attention que tes regexp continuent de faire ce que > tu attends d'elles. > > > use CGI qw/:utf8/; > > La doc CGI n'indique pas d'option :utf8, par contre il y a une option -utf8, > qui semble t'être utile à première vue. De la précipitation, Désolé. > > > > >et en utilisant l'option -C avec > > > > -COE > > Pas faux à proprement parler, mais mieux vaut appliquer manuellement la > couche ':encoding(UTF-8)' sur STDOUT et STDERR via binmode (-COE doit être > placé sur le shebang ce qui ne sera pas très lisible quand tu reviendras > relire ton code dans 5 ans, et je crois qu'il est implémenté par la couche > ':utf8' qui ne vérifie pas que les sorties sont bien encodées). Ok j'aviserai. Je vois que mon affaire s'engage plutôt bien. J'ai aussi des interactions avec du MySQL, HTTP::OAI et autre SOAP, mais si la base est bonne, le reste devrait suivre sans trop de difficulté. Merci Dominique > > > > >sachant que ces scripts tournent dans un contexte CGI où le STDIN ne > >doit pas être altéré puisqu'on récupère les upload par cette voie. Et > >a priori je ne souhaite pas non plus que les entrées/sorties de > >fichier soient altérés par des encode/décode. > > > >Peut-être peut-on regrouper des choses mais par exemple, je n'ai pas > >remarqué que le module Modern::Perl comportait des options à propos de > >l'Unicode. > > > >Merci de vos commentaires. > > > >Dominique > > > > > Vincent > _______________________________________________ > Perl mailing list > Perl at mongueurs.net > http://listes.mongueurs.net/mailman/listinfo/perl -- From rgarciasuarez at gmail.com Thu Jun 16 08:24:04 2016 From: rgarciasuarez at gmail.com (Rafael Garcia-Suarez) Date: Thu, 16 Jun 2016 08:24:04 +0200 Subject: [Perl] =?utf-8?q?passage_=C3=A0_UTF-8?= In-Reply-To: <20160614184446.GA14668@telecom-paristech.fr> References: <20160614184446.GA14668@telecom-paristech.fr> Message-ID: Peut-être que cette succinte documentation pourra t'apporter des éclaircissements: https://github.com/rgs/p5-intelligible-unicode 2016-06-14 20:44 GMT+02:00 Dominique Asselineau : > Bonjour, > > Je suis en train de passer en UTF-8 mes kilomètres de code Perl. J'ai > parcouru pas mal de docs avant de me lancer mais je préférerais avoir > votre avis, en tout cas celui de ceux qui ont réalisé l'opération avec > succès, avant d'avancer davantage au risque de faire des mauvais choix. > > Naturellement, comme je n'ai pas envie d'agir au coup par coup par des > encode/decode et :utf8 à chaque entrée/sortie, j'essaie de charger des > modules qui permettent de traiter une grosse partie des cas. > > Est-ce que je m'y prends bien en mettant en en-tête de tous mes sources les lignes suivantes ? > > use Modern::Perl; > use utf8; > use feature qw/unicode_strings/; > use CGI qw/:utf8/; > > et en utilisant l'option -C avec > > -COE > > sachant que ces scripts tournent dans un contexte CGI où le STDIN ne > doit pas être altéré puisqu'on récupère les upload par cette voie. Et > a priori je ne souhaite pas non plus que les entrées/sorties de > fichier soient altérés par des encode/décode. > > Peut-être peut-on regrouper des choses mais par exemple, je n'ai pas > remarqué que le module Modern::Perl comportait des options à propos de > l'Unicode. > > Merci de vos commentaires. > > Dominique > > -- > _______________________________________________ > Perl mailing list > Perl at mongueurs.net > http://listes.mongueurs.net/mailman/listinfo/perl From asseline at telecom-paristech.fr Fri Jun 17 18:39:25 2016 From: asseline at telecom-paristech.fr (Dominique Asselineau) Date: Fri, 17 Jun 2016 18:39:25 +0200 Subject: [Perl] =?iso-8859-1?q?passage_=E0_UTF-8?= In-Reply-To: References: <20160614184446.GA14668@telecom-paristech.fr> Message-ID: <20160617163924.GA27491@telecom-paristech.fr> Rafael Garcia-Suarez wrote on Thu, Jun 16, 2016 at 08:24:04AM +0200 > Peut-être que cette succinte documentation pourra t'apporter des > éclaircissements: > https://github.com/rgs/p5-intelligible-unicode Merci. Cette doc est particulièrement instructive. Il y a beaucoup d'exemples et surtout des exemples d'erreurs à ne pas commettre. Dominique -- From emmanuel at seyman.fr Tue Jun 21 10:03:21 2016 From: emmanuel at seyman.fr (Emmanuel Seyman) Date: Tue, 21 Jun 2016 10:03:21 +0200 Subject: [Perl] =?iso-8859-1?q?Les_Journ=E9es_Perl_2016_sont_l=E0?= Message-ID: <20160621080321.GA26639@orient> Bonjour à tous. Les Journées Perl approchent à grands pas et le programme est disponible en ligne[1]. Nous commencerons avec un diner au O Philos'off [2] pour se rencontrer et se mettre en appétit pour l'évènement à proprement parler. Rendez-vous donc à 20h jeudi soir au 86 Bd Diderot, dans le 12ième. Les conférences commencent à 10h le lendemain au Carrefour Numérique de la Cité des Sciences [3]. Le Carrefour se situe à 1er sous-sol de la Cite et nous serons dans la salle Agora, tout au fond du Carrefour. En venant quelques minutes plus tôt, vous pourrez profiter d'une tasse de café et entendre le discours d'introduction de votre humble serviteur. Les conférences durent toute la journée de vendredi avec une pause de cinq minutes entre chaque conférence et une pause d'une heure pour le déjeuner. Les conférences de l'après-midi seront dédiées à Perl 6, le membre le plus récent de la famille Perl. Nous avons choisi de diner vendredi à L'Oriental [4], un restaurent libanais au 58, rue de l?Ourcq. Un appel sera fait en début d'après-midi pour savoir combien de gens pensent se joindre à nous. La matinée du samedi est dédié à l'assemblée générale des Mongueurs de Perl. Les conférences commenceront à 14h et se termineront à 16h50. Les conférences sont toutes enregistrées et seront diffusés sur la chaîne Youtube des Mongueurs de Perl [5]. [1] http://journeesperl.fr/fpw2016/schedule [2] http://www.lafourchette.com/restaurant/o-philos-off/25510 [3] http://www.cite-sciences.fr/fr/accueil/ [4] http://www.restaurant-libanais.net/ [5] https://www.youtube.com/user/mongueursdeperl Emmanuel From philippe.delavalade at orange.fr Fri Jun 24 13:45:13 2016 From: philippe.delavalade at orange.fr (Philippe Delavalade) Date: Fri, 24 Jun 2016 13:45:13 +0200 Subject: [Perl] Sous-ensembles et familles Message-ID: <20160624114513.GA4819@messier31> Bonjour la liste. Pour trouver les sous-ensembles d'un ensemble, j'utilise Algorithm::ChooseSubsets. J'aimerais savoir, si à votre connaissance, il existerait quelque chose de similaire donnant des familles de cardinal donné, donc avec répétitions possibles ; les familles (ou n-uplets) de {1,2,3} étant par exemple du genre (1,1,2,2,3) si l'on veut des familles de cinq éléments. J'aimerais éviter des boucles imbriquées très nombreuses ; c'est vraiment casse-pied à écrire :-) Merci d'avance. -- Ph. Delavalade From perl at profvince.com Fri Jun 24 14:07:36 2016 From: perl at profvince.com (Vincent Pit (VPIT)) Date: Fri, 24 Jun 2016 14:07:36 +0200 Subject: [Perl] Sous-ensembles et familles In-Reply-To: <20160624114513.GA4819@messier31> References: <20160624114513.GA4819@messier31> Message-ID: Le 24/06/2016 à 13:45, Philippe Delavalade a écrit : > Bonjour la liste. > > Pour trouver les sous-ensembles d'un ensemble, j'utilise > Algorithm::ChooseSubsets. > > J'aimerais savoir, si à votre connaissance, il existerait quelque chose de > similaire donnant des familles de cardinal donné, donc avec répétitions > possibles ; les familles (ou n-uplets) de {1,2,3} étant par exemple du genre > (1,1,2,2,3) si l'on veut des familles de cinq éléments. > > J'aimerais éviter des boucles imbriquées très nombreuses ; c'est vraiment > casse-pied à écrire :-) > > Merci d'avance. > Pour obtenir toutes les manières de choisir avec remise k nombres parmi 0 .. n-1, le truc habituel est de parcourir tous les entiers entre 0 et n^k-1 et de regarder quelle est leur écriture en base n. Les coefficients de cette écriture te donnent exactement les familles qui t'intéressent. Si en plus l'ordre du choix n'a pas d'importance pour toi (i.e. que tu considères que les familles 1,1,2,2,3 et 1,2,3,2,1 sont les mêmes), il suffit d'utiliser une table de hachage dont les clés sont tes familles triées. Vincent From xcaron at gmail.com Fri Jun 24 15:10:12 2016 From: xcaron at gmail.com (Xavier Caron) Date: Fri, 24 Jun 2016 15:10:12 +0200 Subject: [Perl] Sous-ensembles et familles In-Reply-To: <20160624114513.GA4819@messier31> References: <20160624114513.GA4819@messier31> Message-ID: Hello, > Le 24 juin 2016 à 13:45, Philippe Delavalade a écrit : > > Pour trouver les sous-ensembles d'un ensemble, j'utilise > Algorithm::ChooseSubsets. > > J'aimerais savoir, si à votre connaissance, il existerait quelque chose de > similaire donnant des familles de cardinal donné, donc avec répétitions > possibles ; les familles (ou n-uplets) de {1,2,3} étant par exemple du genre > (1,1,2,2,3) si l'on veut des familles de cinq éléments. > > J'aimerais éviter des boucles imbriquées très nombreuses ; c'est vraiment > casse-pied à écrire :-) Peut-être du côté d? Algorithm::Combinatorics : https://metacpan.org/pod/Algorithm::Combinatorics Si c?est bien ce que tu cherches, je m?en suis déjà servi en production dans un Karma précédent et ça marchait bien. @+, X. From asseline at telecom-paristech.fr Fri Jun 24 15:50:01 2016 From: asseline at telecom-paristech.fr (Dominique Asselineau) Date: Fri, 24 Jun 2016 15:50:01 +0200 Subject: [Perl] DBI DBD::MySQL et UTF-8 Message-ID: <20160624135000.GA782@telecom-paristech.fr> Bonjour, Je passe tout mes codes en Unicode (encodage UTF8) et je rencontre des difficultés avec DBI/DBD::MySQL. Avec le paramètre "mysql_enable_utf8=1" passé à la connexion, l'entrée et l'encodage des données dans un colonne de type varchar se passe bien, tout semble correctement encodé dans la base de données (vérifié avec un client mysql en console). Maintenant, quand je cherche à récupérer les données, stockées dans du varchar donc, elles restent à l'état de chaîne d'octets et ne sont donc pas décodées. En clair, les opérations entrée et sortie ne sont pas symétriques. Voici un ECM qui met en évidence le problème. On remarque que la variable $sOut n'a pas « une bonne tête ». Naturellement je pourrais faire un decode_utf8 dessus, ça marche en effet, mais là... Si c'est la solution, je vais y passer l'été... Y aurait-il une solution plus globale ? #!/usr/bin/perl use Modern::Perl; use utf8; use feature qw/unicode_strings/; use DBI; use Data::Dumper; my $dbh = DBI->connect( "DBI:mysql:database=unBase;". "mysql_enable_utf8=1;", 'unUser', 'sonPassword' ) || die; $dbh->do( "create temporary table temp (\n". " s varchar(255)\n". ") " ) || die; my $sIn = "?uf"; my $sInDesc = DBI::data_string_desc( $sIn ); print( Data::Dumper->Dump( [$sInDesc], ['sInDesc'] ) ); $dbh->do( "insert into temp values ( '$sIn' ) " ) || die; my $sth = $dbh->prepare( "select s from temp" ) || die; $sth->execute() || die; my( $sOut ) = $sth->fetchrow(); $sth->finish() || die; my $sOutDesc = DBI::data_string_desc( $sOut ); print( Data::Dumper->Dump( [$sOutDesc], ['sOutDesc'] ) ); -- From laurent.rosenfeld at googlemail.com Fri Jun 24 18:42:47 2016 From: laurent.rosenfeld at googlemail.com (Laurent Rosenfeld) Date: Fri, 24 Jun 2016 18:42:47 +0200 Subject: [Perl] Sous-ensembles et familles In-Reply-To: <20160624114513.GA4819@messier31> References: <20160624114513.GA4819@messier31> Message-ID: Le mieux est d'utiliser Algorithm::Combinatorics ou un module apparenté si cela te fournit ce dont tu as besoin. Sinon, si tu dois coder toi-même un besoin ne correspondant pas à ces modules, pour éviter des boucles imbriquées nombreuses et surtout dont le nombre variera selon le besoin, donc codées en dur de façon différente pour chaque cardinalité désirée, une bonne fonction récursive devrait faire facilement l'affaire. Le 24 juin 2016 à 13:45, Philippe Delavalade a écrit : > Bonjour la liste. > > Pour trouver les sous-ensembles d'un ensemble, j'utilise > Algorithm::ChooseSubsets. > > J'aimerais savoir, si à votre connaissance, il existerait quelque chose de > similaire donnant des familles de cardinal donné, donc avec répétitions > possibles ; les familles (ou n-uplets) de {1,2,3} étant par exemple du > genre > (1,1,2,2,3) si l'on veut des familles de cinq éléments. > > J'aimerais éviter des boucles imbriquées très nombreuses ; c'est vraiment > casse-pied à écrire :-) > > Merci d'avance. > > -- > Ph. Delavalade > _______________________________________________ > Perl mailing list > Perl at mongueurs.net > http://listes.mongueurs.net/mailman/listinfo/perl > -------------- section suivante -------------- Une pièce jointe HTML a été nettoyée... URL: From philippe.delavalade at orange.fr Fri Jun 24 19:28:15 2016 From: philippe.delavalade at orange.fr (Philippe Delavalade) Date: Fri, 24 Jun 2016 19:28:15 +0200 Subject: [Perl] Sous-ensembles et familles In-Reply-To: References: <20160624114513.GA4819@messier31> Message-ID: <20160624172815.GA5096@messier31> Merci à tous pour les réponses. Je vais donc m'intéresser au module Algorithm::Combinatorics. Cela dit, l'idée de Vincent sur l'écriture en base $n$ des nombres de $1$ à $n^k-1$ me plaît beaucoup :-) Encore un grand merci. -- Ph. Delavalade From paul.gaborit at gmail.com Sat Jun 25 08:55:43 2016 From: paul.gaborit at gmail.com (Paul Gaborit) Date: Sat, 25 Jun 2016 08:55:43 +0200 Subject: [Perl] DBI DBD::MySQL et UTF-8 In-Reply-To: <20160624135000.GA782@telecom-paristech.fr> References: <20160624135000.GA782@telecom-paristech.fr> Message-ID: <576E2AEF.4040307@gmail.com> Le 24/06/2016 15:50, Dominique Asselineau a écrit : > Je passe tout mes codes en Unicode (encodage UTF8) et je rencontre des > difficultés avec DBI/DBD::MySQL. > > Avec le paramètre "mysql_enable_utf8=1" passé à la connexion, l'entrée > et l'encodage des données dans un colonne de type varchar se passe bien, > tout semble correctement encodé dans la base de données (vérifié avec > un client mysql en console). Maintenant, quand je cherche à récupérer > les données, stockées dans du varchar donc, elles restent à l'état de > chaîne d'octets et ne sont donc pas décodées. En clair, les > opérations entrée et sortie ne sont pas symétriques. Un appel à $dbh->do('set names utf8'); devrait aider... -- Paul Gaborit From hugues at max4mail.com Sat Jun 25 10:23:47 2016 From: hugues at max4mail.com (Hugues) Date: Sat, 25 Jun 2016 10:23:47 +0200 Subject: [Perl] Dbix::Class Message-ID: Bonjour je cherche à faire une requête SQL toute simple avec Dbix::Class avec un OR du genre SELECT * FROM Employe WHERE ( TEL_MOBILE = "06000000" OR TELEPHONE='06000000') j'ai essayé les -or => [ .... ] , [ ...]... j'arrive a des requêtes fausses ....FROM Employe me WHERE ( ( me.-or = 'TEL_MOBILE' OR me.-or = '06000000' OR me.-or = 'TELEPHONE' si quelqu'un a une idée ? Merci Hugues. -------------- section suivante -------------- Une pièce jointe HTML a été nettoyée... URL: From xcaron at gmail.com Sat Jun 25 10:52:50 2016 From: xcaron at gmail.com (Xavier Caron) Date: Sat, 25 Jun 2016 10:52:50 +0200 Subject: [Perl] Dbix::Class In-Reply-To: References: Message-ID: Hello, > Le 25 juin 2016 à 10:23, Hugues a écrit : > > je cherche à faire une requête SQL toute simple avec Dbix::Class avec un OR du genre > > SELECT * FROM Employe WHERE ( TEL_MOBILE = "06000000" OR TELEPHONE='06000000') > > j'ai essayé les -or => [ .... ] , [ ...]... > > j'arrive a des requêtes fausses > > ....FROM Employe me WHERE ( ( me.-or = 'TEL_MOBILE' OR me.-or = '06000000' OR me.-or = 'TELEPHONE' > > > > si quelqu'un a une idée ? Un truc comme : status => [ -or => {'=', 'assigned'}, {'=', 'in-progress?}] C?est dans la documentation de SQL::Abstract : https://metacpan.org/pod/SQL::Abstract#Logic-and-nesting-operators HTH. @+, X. From hugues at max4mail.com Sat Jun 25 12:19:49 2016 From: hugues at max4mail.com (Hugues) Date: Sat, 25 Jun 2016 12:19:49 +0200 Subject: [Perl] Dbix::Class In-Reply-To: References: Message-ID: <1742aee3-1485-5907-523d-fe2c9bc254be@max4mail.com> oui ça fait WHERE status='assigned' OR status ='in-progress' mais je cherche a faire le OR deux champs différentes, pas le même champs Hugues Le 25/06/2016 à 10:52, Xavier Caron a écrit : > Hello, > >> Le 25 juin 2016 à 10:23, Hugues a écrit : >> >> je cherche à faire une requête SQL toute simple avec Dbix::Class avec un OR du genre >> >> SELECT * FROM Employe WHERE ( TEL_MOBILE = "06000000" OR TELEPHONE='06000000') >> >> j'ai essayé les -or => [ .... ] , [ ...]... >> >> j'arrive a des requêtes fausses >> >> ....FROM Employe me WHERE ( ( me.-or = 'TEL_MOBILE' OR me.-or = '06000000' OR me.-or = 'TELEPHONE' >> >> >> >> si quelqu'un a une idée ? > Un truc comme : > > status => [ -or => {'=', 'assigned'}, {'=', 'in-progress?}] > > C?est dans la documentation de SQL::Abstract : > > https://metacpan.org/pod/SQL::Abstract#Logic-and-nesting-operators > > HTH. > > @+, > > X. > > _______________________________________________ > Perl mailing list > Perl at mongueurs.net > http://listes.mongueurs.net/mailman/listinfo/perl -------------- section suivante -------------- Une pièce jointe HTML a été nettoyée... URL: From xcaron at gmail.com Sat Jun 25 12:51:06 2016 From: xcaron at gmail.com (Xavier Caron) Date: Sat, 25 Jun 2016 12:51:06 +0200 Subject: [Perl] Dbix::Class In-Reply-To: <1742aee3-1485-5907-523d-fe2c9bc254be@max4mail.com> References: <1742aee3-1485-5907-523d-fe2c9bc254be@max4mail.com> Message-ID: <5A0FD42C-72AF-4F8F-B3D1-F3E3E2F055DF@gmail.com> Re-, > Le 25 juin 2016 à 12:19, Hugues a écrit : > > oui ça fait > > WHERE status='assigned' OR status ='in-progress' > > mais je cherche a faire le OR deux champs différentes, pas le même champs Dans la doc : my @where = ( { user => 'nwiger', status => { -like => ['pending%', 'dispatched'] }, }, { user => 'robot', status => 'unassigned', } ); C?est là : https://metacpan.org/pod/SQL::Abstract#Nested-conditions--and--or-prefixes Donc (pas vérifié) je suppose que l?on peut faire : my @where = ( { status => ?assigned? }, { trucmuche => ?machin-chouette? }, ); Si je me souviens bien, l?array (de hashes) fait du OU et la hash fait du AND. @+, X. From hugues at max4mail.com Tue Jun 28 09:47:33 2016 From: hugues at max4mail.com (Hugues) Date: Tue, 28 Jun 2016 09:47:33 +0200 Subject: [Perl] Dbix::Class In-Reply-To: <5A0FD42C-72AF-4F8F-B3D1-F3E3E2F055DF@gmail.com> References: <1742aee3-1485-5907-523d-fe2c9bc254be@max4mail.com> <5A0FD42C-72AF-4F8F-B3D1-F3E3E2F055DF@gmail.com> Message-ID: Non en fait ça fonctionne pas avec my @where = ( { TEL_MOBILE => $l->{'caller'}->{'number'} }, { TELEPHONE => $l->{'caller'}->{'number'} }); my $mobile = schema('DB')->resultset('Employe')->find( @where , { rows => 1}); ça me fait une requête de ce type SELECT ............ me.ENTITE_ORIGINE FROM employe me WHERE ( me.TEL_MOBILE = '06000000' ) LIMIT 1 Hugues. Le 25/06/2016 à 12:51, Xavier Caron a écrit : > Re-, > >> Le 25 juin 2016 à 12:19, Hugues a écrit : >> >> oui ça fait >> >> WHERE status='assigned' OR status ='in-progress' >> >> mais je cherche a faire le OR deux champs différentes, pas le même champs > Dans la doc : > > my @where = ( > { > user => 'nwiger', > status => { -like => ['pending%', 'dispatched'] }, > }, > { > user => 'robot', > status => 'unassigned', > } > ); > > C?est là : > > https://metacpan.org/pod/SQL::Abstract#Nested-conditions--and--or-prefixes > > Donc (pas vérifié) je suppose que l?on peut faire : > > my @where = ( > { status => ?assigned? }, > { trucmuche => ?machin-chouette? }, > ); > > Si je me souviens bien, l?array (de hashes) fait du OU et la hash fait du AND. > > @+, > > X. > > _______________________________________________ > Perl mailing list > Perl at mongueurs.net > http://listes.mongueurs.net/mailman/listinfo/perl -------------- section suivante -------------- Une pièce jointe HTML a été nettoyée... URL: From xcaron at gmail.com Tue Jun 28 09:56:57 2016 From: xcaron at gmail.com (Xavier Caron) Date: Tue, 28 Jun 2016 09:56:57 +0200 Subject: [Perl] Dbix::Class In-Reply-To: References: <1742aee3-1485-5907-523d-fe2c9bc254be@max4mail.com> <5A0FD42C-72AF-4F8F-B3D1-F3E3E2F055DF@gmail.com> Message-ID: > Le 28 juin 2016 à 09:47, Hugues a écrit : > > my $mobile = schema('DB')->resultset('Employe')->find( @where , { rows => 1}); Et avec : my $mobile = schema('DB')->resultset('Employe')->find( \@where , { rows => 1}); (« \@where » au lieu de « @where ») From hugues at max4mail.com Tue Jun 28 10:28:49 2016 From: hugues at max4mail.com (Hugues) Date: Tue, 28 Jun 2016 10:28:49 +0200 Subject: [Perl] Dbix::Class In-Reply-To: References: <1742aee3-1485-5907-523d-fe2c9bc254be@max4mail.com> <5A0FD42C-72AF-4F8F-B3D1-F3E3E2F055DF@gmail.com> Message-ID: non, il comprend pas avec \@where my $mobile = schema('DB')->resultset('Employe')->find( \@where , { rows => 1}); error @0.914144> request to GET /svi/status crashed: DBIx::Class::ResultSource::unique_constraint_columns(): Unknown unique constraint primary on 'employe' at /home/git/svi/lib/svi/admin.pm line 315 in /usr/local/share/perl5/Dancer/Handler.pm l. 98 Hugues Le 28/06/2016 à 09:56, Xavier Caron a écrit : >> Le 28 juin 2016 à 09:47, Hugues a écrit : >> >> my $mobile = schema('DB')->resultset('Employe')->find( @where , { rows => 1}); > Et avec : > > my $mobile = schema('DB')->resultset('Employe')->find( \@where , { rows => 1}); > > (« \@where » au lieu de « @where ») > _______________________________________________ > Perl mailing list > Perl at mongueurs.net > http://listes.mongueurs.net/mailman/listinfo/perl -------------- section suivante -------------- Une pièce jointe HTML a été nettoyée... URL: From philippe.bruhat at free.fr Tue Jun 28 10:43:10 2016 From: philippe.bruhat at free.fr (Philippe Bruhat (BooK)) Date: Tue, 28 Jun 2016 10:43:10 +0200 Subject: [Perl] Dbix::Class In-Reply-To: References: <1742aee3-1485-5907-523d-fe2c9bc254be@max4mail.com> <5A0FD42C-72AF-4F8F-B3D1-F3E3E2F055DF@gmail.com> Message-ID: <20160628084310.GA18870@zok> On Tue, Jun 28, 2016 at 10:28:49AM +0200, Hugues wrote: > non, il comprend pas avec \@where > > my $mobile = schema('DB')->resultset('Employe')->find( \@where , { rows => 1}); > Si, il comprend, mais il fait une erreur: > error @0.914144> request to GET /svi/status crashed: > DBIx::Class::ResultSource::unique_constraint_columns(): Unknown unique > constraint primary on 'employe' at /home/git/svi/lib/svi/admin.pm line 315 > in /usr/local/share/perl5/Dancer/Handler.pm l. 98 Essaye avec search() plutôt que find() (qui suppose que la requête ne peut renvoyer que 0 ou 1 résultat). -- Philippe Bruhat (BooK) The faster the climb, the swifter the fall. (Moral from Groo The Wanderer #87 (Epic)) From hugues at max4mail.com Tue Jun 28 10:54:08 2016 From: hugues at max4mail.com (Hugues) Date: Tue, 28 Jun 2016 10:54:08 +0200 Subject: [Perl] Dbix::Class In-Reply-To: <20160628084310.GA18870@zok> References: <1742aee3-1485-5907-523d-fe2c9bc254be@max4mail.com> <5A0FD42C-72AF-4F8F-B3D1-F3E3E2F055DF@gmail.com> <20160628084310.GA18870@zok> Message-ID: <81f5170a-8259-2c2c-35a2-fb842ba8697b@max4mail.com> le search ne marche pas { "error" : "DBIx::Class::ResultSet::search_rs(): Odd number of arguments to search at admin.pm line 314\n", "exception" : "DBIx::Class::Exception" } my $mobile = schema('DB')->resultset('Employe')->search( @where , { rows => 1}); ou my $mobile = schema('DB')->resultset('Employe')->search( \@where , { rows => 1}); erreur Can't locate object method \"prenom\" via package \"DBIx::Class::ResultSet le find marche, mais ne passe qu'un seul des deux éléments du where l'autre solution c'est : my $mobile = schema('DB')->resultset('Employe')->find( { TEL_MOBILE => $l->{'caller'}->{'number'} }, { rows => 1}); my $tel = schema('DB')->resultset('Employe')->find( { TELEPHONE => $l->{'caller'}->{'number'} }, { rows => 1}); c'est quand même pas super... :-( pour un simple OU Hugues. Le 28/06/2016 à 10:43, Philippe Bruhat (BooK) a écrit : > On Tue, Jun 28, 2016 at 10:28:49AM +0200, Hugues wrote: >> non, il comprend pas avec \@where >> >> my $mobile = schema('DB')->resultset('Employe')->find( \@where , { rows => 1}); >> > Si, il comprend, mais il fait une erreur: > >> error @0.914144> request to GET /svi/status crashed: >> DBIx::Class::ResultSource::unique_constraint_columns(): Unknown unique >> constraint primary on 'employe' at /home/git/svi/lib/svi/admin.pm line 315 >> in /usr/local/share/perl5/Dancer/Handler.pm l. 98 > Essaye avec search() plutôt que find() (qui suppose que la requête ne peut > renvoyer que 0 ou 1 résultat). > -------------- section suivante -------------- Une pièce jointe HTML a été nettoyée... URL: From philippe.bruhat at free.fr Tue Jun 28 12:14:56 2016 From: philippe.bruhat at free.fr (Philippe Bruhat (BooK)) Date: Tue, 28 Jun 2016 12:14:56 +0200 Subject: [Perl] Dbix::Class In-Reply-To: <81f5170a-8259-2c2c-35a2-fb842ba8697b@max4mail.com> References: <1742aee3-1485-5907-523d-fe2c9bc254be@max4mail.com> <5A0FD42C-72AF-4F8F-B3D1-F3E3E2F055DF@gmail.com> <20160628084310.GA18870@zok> <81f5170a-8259-2c2c-35a2-fb842ba8697b@max4mail.com> Message-ID: <20160628101456.GB18870@zok> On Tue, Jun 28, 2016 at 10:54:08AM +0200, Hugues wrote: > le search ne marche pas > Les messages d'erreur sont là pour t'aider. > { > "error" : "DBIx::Class::ResultSet::search_rs(): Odd number of arguments to search at admin.pm line 314\n", > "exception" : "DBIx::Class::Exception" > } "Odd number of arguments to search" : si on regarde la doc, le arguments attendus sont: https://metacpan.org/pod/DBIx::Class::ResultSet#search Arguments: $cond | undef, \%attrs? La méthode attend un paramètre scalaire (de la forme acceptée par SQL::Abstract, ou bien undef), suivi d'un paramètre optionel (une référence à un hash) contenant les attributs de la requête. > my $mobile = schema('DB')->resultset('Employe')->search( @where , { rows => 1}); > Ici, @where contient deux éléments, donc l'appel revient à ->search( $where[0], $where[1], { rows => 1 } ); ce qui est bien impair. > my $mobile = schema('DB')->resultset('Employe')->search( \@where , { rows => 1}); > Ici, $cond est \@where, une référence à un table. Le second paramètre, \%attr vaut bien { rows => 1 }. L'appel est sémantiquement correct. > erreur > > Can't locate object method \"prenom\" via package \"DBIx::Class::ResultSet > Là encore, le message d'erreur est assez informatif : c'est quoi cette méthod prenom que le code cherche à appeler sur la classe DBIx::Class::ResultSet ? Il n'y a rien dans le code que tu as montré qui permette de déduire quoi que ce soit à ce sujet. > > le find marche, mais ne passe qu'un seul des deux éléments du where Comme indiqué dans la documentation: https://metacpan.org/pod/DBIx::Class::ResultSet#find Finds and returns a single row based on supplied criteria. Autrement, le fait qu'il renvoie un seul élément est le comportement attendu. > l'autre solution c'est : > > my $mobile = schema('DB')->resultset('Employe')->find( { TEL_MOBILE => > $l->{'caller'}->{'number'} }, { rows => 1}); > my $tel = schema('DB')->resultset('Employe')->find( { TELEPHONE => > $l->{'caller'}->{'number'} }, { rows => 1}); L'attribut { rows => 1 } dit explicitement à DBIx::Class que tu veux une seule ligne (c'est l'équivalent de LIMIT 1), search ne renverra donc jamais plus d'une ligne. Si ça se trouve, ça "marche" depuis le début, et ton programme te donne la bonne réponse à une mauvaise question... Pour faciliter le déboggage avec DBIx::Class, et voir un peu la tête des requêtes exécutées, je te conseille l'emploi de la variable d'environnement DBIC_TRACE. Quand elle est à 1, DBIC affiche les requête sur la sortie d'erreur standard. Je pense que le LIMIT 1 t'aurais sauté aux yeux. Je vais conclure en citant Klortho le magnifique (cf. Acme::MJD) : #11919 No. You must believe the ERROR MESSAGE. You MUST believe the error message. et #11920 The error message is the Truth. The error message is God. -- Philippe Bruhat (BooK) The emptier the brain is of facts, the easier it is to fill with nonsense. (Moral from Groo The Wanderer #89 (Epic)) From asseline at telecom-paristech.fr Tue Jun 28 14:45:37 2016 From: asseline at telecom-paristech.fr (Dominique Asselineau) Date: Tue, 28 Jun 2016 14:45:37 +0200 Subject: [Perl] DBI DBD::MySQL et UTF-8 In-Reply-To: <576E2AEF.4040307@gmail.com> References: <20160624135000.GA782@telecom-paristech.fr> <576E2AEF.4040307@gmail.com> Message-ID: <20160628124537.GA25696@telecom-paristech.fr> Paul Gaborit wrote on Sat, Jun 25, 2016 at 08:55:43AM +0200 > Le 24/06/2016 15:50, Dominique Asselineau a écrit : > >Je passe tout mes codes en Unicode (encodage UTF8) et je rencontre des > >difficultés avec DBI/DBD::MySQL. > > > >Avec le paramètre "mysql_enable_utf8=1" passé à la connexion, l'entrée > >et l'encodage des données dans un colonne de type varchar se passe bien, > >tout semble correctement encodé dans la base de données (vérifié avec > >un client mysql en console). Maintenant, quand je cherche à récupérer > >les données, stockées dans du varchar donc, elles restent à l'état de > >chaîne d'octets et ne sont donc pas décodées. En clair, les > >opérations entrée et sortie ne sont pas symétriques. > > Un appel à > > $dbh->do('set names utf8'); > > devrait aider... Malheureusement non. Le résultat est toujours une chaîne d'octets qu'il faut explicitement décoder par Encode::decode_utf8 si et seulement si elle provient d'un type SQL char, varchar ou text. Pour essayer de globaliser le traitement de la récupération de données, peut-être faut-il dériver la classe DBI::st pour pouvoir traiter le résultat du fetchrow de base afin de faire les décodages appropriés. Peut-être n'ai-je pas suffisamment cherché mais je n'ai rien trouvé de la sorte. Dominique -- From xcaron at gmail.com Tue Jun 28 14:57:15 2016 From: xcaron at gmail.com (Xavier Caron) Date: Tue, 28 Jun 2016 14:57:15 +0200 Subject: [Perl] Dbix::Class In-Reply-To: <20160628101456.GB18870@zok> References: <1742aee3-1485-5907-523d-fe2c9bc254be@max4mail.com> <5A0FD42C-72AF-4F8F-B3D1-F3E3E2F055DF@gmail.com> <20160628084310.GA18870@zok> <81f5170a-8259-2c2c-35a2-fb842ba8697b@max4mail.com> <20160628101456.GB18870@zok> Message-ID: > Le 28 juin 2016 à 12:14, Philippe Bruhat (BooK) a écrit : > > Je vais conclure en citant Klortho le magnifique (cf. Acme::MJD) : > > #11919 No. You must believe the ERROR MESSAGE. You MUST believe the error message. > > et > > #11920 The error message is the Truth. The error message is God. Klortho rulz ;^) From paul.gaborit at gmail.com Tue Jun 28 16:35:21 2016 From: paul.gaborit at gmail.com (Paul Gaborit) Date: Tue, 28 Jun 2016 16:35:21 +0200 Subject: [Perl] DBI DBD::MySQL et UTF-8 In-Reply-To: <20160628124537.GA25696@telecom-paristech.fr> References: <20160624135000.GA782@telecom-paristech.fr> <576E2AEF.4040307@gmail.com> <20160628124537.GA25696@telecom-paristech.fr> Message-ID: <57728B29.4030906@gmail.com> Le 28/06/2016 14:45, Dominique Asselineau a écrit : > Paul Gaborit wrote on Sat, Jun 25, 2016 at 08:55:43AM +0200 >> Le 24/06/2016 15:50, Dominique Asselineau a écrit : >>> Je passe tout mes codes en Unicode (encodage UTF8) et je rencontre des >>> difficultés avec DBI/DBD::MySQL. >>> >>> Avec le paramètre "mysql_enable_utf8=1" passé à la connexion, l'entrée >>> et l'encodage des données dans un colonne de type varchar se passe bien, >>> tout semble correctement encodé dans la base de données (vérifié avec >>> un client mysql en console). Maintenant, quand je cherche à récupérer >>> les données, stockées dans du varchar donc, elles restent à l'état de >>> chaîne d'octets et ne sont donc pas décodées. En clair, les >>> opérations entrée et sortie ne sont pas symétriques. >> >> Un appel à >> >> $dbh->do('set names utf8'); >> >> devrait aider... > > Malheureusement non. Le résultat est toujours une chaîne d'octets > qu'il faut explicitement décoder par Encode::decode_utf8 si et > seulement si elle provient d'un type SQL char, varchar ou text. Pourtant la documentation de DBD::mysql est claire : ======== mysql_enable_utf8 This attribute determines whether DBD::mysql should assume strings stored in the database are utf8. This feature defaults to off. When set, a data retrieved from a textual column type (char, varchar, etc) will have the UTF-8 flag turned on if necessary. This enables character semantics on that string. You will also need to ensure that your database / table / column is configured to use UTF8. See Chapter 10 of the mysql manual for details. Additionally, turning on this flag tells MySQL that incoming data should be treated as UTF-8. This will only take effect if used as part of the call to connect(). If you turn the flag on after connecting, you will need to issue the command "SET NAMES utf8" to get the same effect. This option is experimental and may change in future versions. ======= Depuis longtemps, j'utilise DBI et MySQL avec des données en UTF8 sans aucun souci. Vos données ne souffriraient-elles pas de double encodage? C'est courant lorsqu'on a fait plusieurs tests successifs. Pour en être sûr, je vous engage à recréer une base vide, à créer des tables avec des champs en UTF8 (il faut le spécifier *explicitement*, c'est le chapitre 11 dans MySQL 5.7 ) puis à peupler ces tables avec des données en UTF8 depuis Perl/DBI et depuis un client comme MySQL-Workbench pour comparer ce qui est stocké puis finalement les réextraire avec Perl/DBI pour vérifier que tout marche bien. Cordialement, -- Paul Gaborit From hugues at max4mail.com Tue Jun 28 16:56:59 2016 From: hugues at max4mail.com (Hugues) Date: Tue, 28 Jun 2016 16:56:59 +0200 Subject: [Perl] Dbix::Class In-Reply-To: <20160628101456.GB18870@zok> References: <1742aee3-1485-5907-523d-fe2c9bc254be@max4mail.com> <5A0FD42C-72AF-4F8F-B3D1-F3E3E2F055DF@gmail.com> <20160628084310.GA18870@zok> <81f5170a-8259-2c2c-35a2-fb842ba8697b@max4mail.com> <20160628101456.GB18870@zok> Message-ID: <154151c7-33fe-6747-d177-5b072d79ed19@max4mail.com> Merci Philippe pour ton aide, je vais regarder + en détails la doc si tu aimes les quotes, elle est pas mal celle la. We don't rise to the level of our expectations, we fall to the level of our training. et c'est vrai que je tombe a mon niveau d'entrainement ... bye Hugues Le 28/06/2016 à 12:14, Philippe Bruhat (BooK) a écrit : > On Tue, Jun 28, 2016 at 10:54:08AM +0200, Hugues wrote: >> le search ne marche pas >> > Les messages d'erreur sont là pour t'aider. > >> { >> "error" : "DBIx::Class::ResultSet::search_rs(): Odd number of arguments to search at admin.pm line 314\n", >> "exception" : "DBIx::Class::Exception" >> } > "Odd number of arguments to search" : si on regarde la doc, le arguments > attendus sont: > > https://metacpan.org/pod/DBIx::Class::ResultSet#search > > Arguments: $cond | undef, \%attrs? > > La méthode attend un paramètre scalaire (de la forme acceptée par > SQL::Abstract, ou bien undef), suivi d'un paramètre optionel (une > référence à un hash) contenant les attributs de la requête. > >> my $mobile = schema('DB')->resultset('Employe')->search( @where , { rows => 1}); >> > Ici, @where contient deux éléments, donc l'appel revient à > > ->search( $where[0], $where[1], { rows => 1 } ); > > ce qui est bien impair. > >> my $mobile = schema('DB')->resultset('Employe')->search( \@where , { rows => 1}); >> > Ici, $cond est \@where, une référence à un table. Le second paramètre, > \%attr vaut bien { rows => 1 }. L'appel est sémantiquement correct. > >> erreur >> >> Can't locate object method \"prenom\" via package \"DBIx::Class::ResultSet >> > Là encore, le message d'erreur est assez informatif : c'est quoi cette méthod > prenom que le code cherche à appeler sur la classe DBIx::Class::ResultSet ? > Il n'y a rien dans le code que tu as montré qui permette de déduire quoi > que ce soit à ce sujet. > >> le find marche, mais ne passe qu'un seul des deux éléments du where > Comme indiqué dans la documentation: https://metacpan.org/pod/DBIx::Class::ResultSet#find > > Finds and returns a single row based on supplied criteria. > > Autrement, le fait qu'il renvoie un seul élément est le comportement attendu. > >> l'autre solution c'est : >> >> my $mobile = schema('DB')->resultset('Employe')->find( { TEL_MOBILE => >> $l->{'caller'}->{'number'} }, { rows => 1}); >> my $tel = schema('DB')->resultset('Employe')->find( { TELEPHONE => >> $l->{'caller'}->{'number'} }, { rows => 1}); > L'attribut { rows => 1 } dit explicitement à DBIx::Class que tu veux > une seule ligne (c'est l'équivalent de LIMIT 1), search ne renverra donc > jamais plus d'une ligne. Si ça se trouve, ça "marche" depuis le début, > et ton programme te donne la bonne réponse à une mauvaise question... > > Pour faciliter le déboggage avec DBIx::Class, et voir un peu la tête > des requêtes exécutées, je te conseille l'emploi de la variable > d'environnement DBIC_TRACE. Quand elle est à 1, DBIC affiche les requête > sur la sortie d'erreur standard. Je pense que le LIMIT 1 t'aurais sauté > aux yeux. > > Je vais conclure en citant Klortho le magnifique (cf. Acme::MJD) : > > #11919 No. You must believe the ERROR MESSAGE. You MUST believe the error message. > > et > > #11920 The error message is the Truth. The error message is God. > -------------- section suivante -------------- Une pièce jointe HTML a été nettoyée... URL: From asseline at telecom-paristech.fr Tue Jun 28 21:03:19 2016 From: asseline at telecom-paristech.fr (Dominique Asselineau) Date: Tue, 28 Jun 2016 21:03:19 +0200 Subject: [Perl] DBI DBD::MySQL et UTF-8 In-Reply-To: <57728B29.4030906@gmail.com> References: <20160624135000.GA782@telecom-paristech.fr> <576E2AEF.4040307@gmail.com> <20160628124537.GA25696@telecom-paristech.fr> <57728B29.4030906@gmail.com> Message-ID: <20160628190319.GA30313@telecom-paristech.fr> Paul Gaborit wrote on Tue, Jun 28, 2016 at 04:35:21PM +0200 > Le 28/06/2016 14:45, Dominique Asselineau a écrit : > >Paul Gaborit wrote on Sat, Jun 25, 2016 at 08:55:43AM +0200 > >>Le 24/06/2016 15:50, Dominique Asselineau a écrit : > >>>Je passe tout mes codes en Unicode (encodage UTF8) et je rencontre des > >>>difficultés avec DBI/DBD::MySQL. > >>> > >>>Avec le paramètre "mysql_enable_utf8=1" passé à la connexion, l'entrée > >>>et l'encodage des données dans un colonne de type varchar se passe bien, > >>>tout semble correctement encodé dans la base de données (vérifié avec > >>>un client mysql en console). Maintenant, quand je cherche à récupérer > >>>les données, stockées dans du varchar donc, elles restent à l'état de > >>>chaîne d'octets et ne sont donc pas décodées. En clair, les > >>>opérations entrée et sortie ne sont pas symétriques. > >> > >>Un appel à > >> > >> $dbh->do('set names utf8'); > >> > >>devrait aider... > > > >Malheureusement non. Le résultat est toujours une chaîne d'octets > >qu'il faut explicitement décoder par Encode::decode_utf8 si et > >seulement si elle provient d'un type SQL char, varchar ou text. > > Pourtant la documentation de DBD::mysql est claire : > > ======== > mysql_enable_utf8 > > This attribute determines whether DBD::mysql should assume > strings stored in the database are utf8. This feature defaults > to off. > > When set, a data retrieved from a textual column type (char, > varchar, etc) will have the UTF-8 flag turned on if > necessary. This enables character semantics on that string. You > will also need to ensure that your database / table / column is > configured to use UTF8. See Chapter 10 of the mysql manual for > details. > > Additionally, turning on this flag tells MySQL that incoming > data should be treated as UTF-8. This will only take effect if > used as part of the call to connect(). If you turn the flag on > after connecting, you will need to issue the command "SET NAMES > utf8" to get the same effect. > > This option is experimental and may change in future versions. > ======= > > Depuis longtemps, j'utilise DBI et MySQL avec des données en UTF8 sans aucun > souci. Vos données ne souffriraient-elles pas de double encodage? Non. J'ai eu ce problème au début effectivement, en manipulant mal le paramètre mysql_enable_utf8 qu'on doit passer dès la connexion. > C'est > courant lorsqu'on a fait plusieurs tests successifs. Je "delete" à chaque fois pour être justement sûr de mes données. > > Pour en être sûr, je vous engage à recréer une base vide, à créer des tables > avec des champs en UTF8 (il faut le spécifier *explicitement*, c'est le > chapitre 11 dans MySQL 5.7 > ) puis à > peupler ces tables avec des données en UTF8 depuis Perl/DBI et depuis un > client comme MySQL-Workbench pour comparer ce qui est stocké puis finalement > les réextraire avec Perl/DBI pour vérifier que tout marche bien. J'avais vérifié le CHARACTER SET de la base de données par SHOW CREATE DATABASE , ça semblait correct. J'ai créé un nouvel ECM en forçant le CHARACTER SET de la table temporaire. Reste un problème éventuel de version, du serveur MySQL notamment qui est en 5.5, mais dès lors que les requêtes fonctionnent, cela ne devrait pas être le bon problème. Cordialement. Dominique -- -------------- section suivante -------------- Une pièce jointe autre que texte a été nettoyée... Nom: dbi-et-utf8.pl Type: text/x-perl Taille: 1207 octets Desc: non disponible URL: From philippe.bruhat at free.fr Wed Jun 29 00:46:38 2016 From: philippe.bruhat at free.fr (Philippe Bruhat (BooK)) Date: Wed, 29 Jun 2016 00:46:38 +0200 Subject: [Perl] DBI DBD::MySQL et UTF-8 In-Reply-To: <20160628190319.GA30313@telecom-paristech.fr> References: <20160624135000.GA782@telecom-paristech.fr> <576E2AEF.4040307@gmail.com> <20160628124537.GA25696@telecom-paristech.fr> <57728B29.4030906@gmail.com> <20160628190319.GA30313@telecom-paristech.fr> Message-ID: <20160628224638.GA2302@zok> On Tue, Jun 28, 2016 at 09:03:19PM +0200, Dominique Asselineau wrote: > Paul Gaborit wrote on Tue, Jun 28, 2016 at 04:35:21PM +0200 > > Le 28/06/2016 14:45, Dominique Asselineau a écrit : > > >Paul Gaborit wrote on Sat, Jun 25, 2016 at 08:55:43AM +0200 > > >>Le 24/06/2016 15:50, Dominique Asselineau a écrit : > > >>>Je passe tout mes codes en Unicode (encodage UTF8) et je rencontre des > > >>>difficultés avec DBI/DBD::MySQL. Une présentation de Ricardo Signes au sujet d'unicode au dernier YAPC::NA https://www.youtube.com/watch?v=TmTeXcEixEg Drôle et instructif. -- Philippe Bruhat (BooK) There is no solution to a problem of sheer greed. (Moral from Groo The Wanderer #94 (Epic)) From asseline at telecom-paristech.fr Wed Jun 29 12:17:28 2016 From: asseline at telecom-paristech.fr (Dominique Asselineau) Date: Wed, 29 Jun 2016 12:17:28 +0200 Subject: [Perl] DBI DBD::MySQL et UTF-8 In-Reply-To: <57728B29.4030906@gmail.com> References: <20160624135000.GA782@telecom-paristech.fr> <576E2AEF.4040307@gmail.com> <20160628124537.GA25696@telecom-paristech.fr> <57728B29.4030906@gmail.com> Message-ID: <20160629101728.GA7190@telecom-paristech.fr> Bonjour, Tout d'abord, désolé pour le message d'hier-soir, pour lequel il y avait un problème dans l'encodage la pièce jointe. Et puis j'avais omis le résultat que j'obtiens avec l'ECM. Paul Gaborit wrote on Tue, Jun 28, 2016 at 04:35:21PM +0200 > Le 28/06/2016 14:45, Dominique Asselineau a écrit : > >Paul Gaborit wrote on Sat, Jun 25, 2016 at 08:55:43AM +0200 > >>Le 24/06/2016 15:50, Dominique Asselineau a écrit : > >>>Je passe tout mes codes en Unicode (encodage UTF8) et je rencontre des > >>>difficultés avec DBI/DBD::MySQL. > >>> > >>>Avec le paramètre "mysql_enable_utf8=1" passé à la connexion, l'entrée > >>>et l'encodage des données dans un colonne de type varchar se passe bien, > >>>tout semble correctement encodé dans la base de données (vérifié avec > >>>un client mysql en console). Maintenant, quand je cherche à récupérer > >>>les données, stockées dans du varchar donc, elles restent à l'état de > >>>chaîne d'octets et ne sont donc pas décodées. En clair, les > >>>opérations entrée et sortie ne sont pas symétriques. > >> > >>Un appel à > >> > >> $dbh->do('set names utf8'); > >> > >>devrait aider... > > > >Malheureusement non. Le résultat est toujours une chaîne d'octets > >qu'il faut explicitement décoder par Encode::decode_utf8 si et > >seulement si elle provient d'un type SQL char, varchar ou text. > > Pourtant la documentation de DBD::mysql est claire : > > ======== > mysql_enable_utf8 > > This attribute determines whether DBD::mysql should assume > strings stored in the database are utf8. This feature defaults > to off. > > When set, a data retrieved from a textual column type (char, > varchar, etc) will have the UTF-8 flag turned on if > necessary. This enables character semantics on that string. You > will also need to ensure that your database / table / column is > configured to use UTF8. See Chapter 10 of the mysql manual for > details. > > Additionally, turning on this flag tells MySQL that incoming > data should be treated as UTF-8. This will only take effect if > used as part of the call to connect(). If you turn the flag on > after connecting, you will need to issue the command "SET NAMES > utf8" to get the same effect. > > This option is experimental and may change in future versions. > ======= > > Depuis longtemps, j'utilise DBI et MySQL avec des données en UTF8 sans aucun > souci. Vos données ne souffriraient-elles pas de double encodage? C'est > courant lorsqu'on a fait plusieurs tests successifs. Non. J'ai eu ce problème au début effectivement, en manipulant mal le paramètre mysql_enable_utf8 qu'on doit passer dès la connexion. Et puis je "delete" à chaque fois pour être justement sûr de mes données. > > Pour en être sûr, je vous engage à recréer une base vide, à créer des tables > avec des champs en UTF8 (il faut le spécifier *explicitement*, c'est le > chapitre 11 dans MySQL 5.7 > ) puis à > peupler ces tables avec des données en UTF8 depuis Perl/DBI et depuis un > client comme MySQL-Workbench pour comparer ce qui est stocké puis finalement > les réextraire avec Perl/DBI pour vérifier que tout marche bien. J'avais vérifié le CHARACTER SET de la base de données par SHOW CREATE DATABASE , ça semblait correct. J'ai créé un nouvel ECM en forçant le CHARACTER SET de la table temporaire. Et cette fois je mets le résultat que j'obtiens avec cet ECM. Reste un problème éventuel de version, du serveur MySQL notamment qui est en 5.5, mais dès lors que les requêtes fonctionnent, cela ne devrait pas être le bon problème. Cordialement. Dominique -- -------------- section suivante -------------- Une pièce jointe autre que texte a été nettoyée... Nom: dbi-et-utf8.pl Type: text/x-perl Taille: 1208 octets Desc: non disponible URL: -------------- section suivante -------------- DBI VERSION: 1.631 DBD mysql VERSION: 4.028 $tempShow = { 'temp' => 'CREATE TEMPORARY TABLE `temp` ( `s` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8' }; $sInDesc = 'UTF8 on, non-ASCII, 3 characters 4 bytes'; $sOutDesc = 'UTF8 off, non-ASCII, 4 characters 4 bytes'; From minc.charles at wanadoo.fr Wed Jun 29 16:41:14 2016 From: minc.charles at wanadoo.fr (minc) Date: Wed, 29 Jun 2016 16:41:14 +0200 Subject: [Perl] [HS] Re: DBI DBD::MySQL et UTF-8 -Ricardo Signes In-Reply-To: <20160628224638.GA2302@zok> References: <20160624135000.GA782@telecom-paristech.fr> <576E2AEF.4040307@gmail.com> <20160628124537.GA25696@telecom-paristech.fr> <57728B29.4030906@gmail.com> <20160628190319.GA30313@telecom-paristech.fr> <20160628224638.GA2302@zok> Message-ID: Ce document est impressionnant à plus d'un titre. Bien que je sois hypnotisé par la chemise à fleurs, je remarque la qualité de la présentation de cette vidéo et je me demande comment ils ont réalisé le mixage du présentateur et le contenu de la présentation, superbe ? Ch. Minc Le 29/06/2016 à 00:46, Philippe Bruhat (BooK) a écrit : > On Tue, Jun 28, 2016 at 09:03:19PM +0200, Dominique Asselineau wrote: >> Paul Gaborit wrote on Tue, Jun 28, 2016 at 04:35:21PM +0200 >>> Le 28/06/2016 14:45, Dominique Asselineau a écrit : >>>> Paul Gaborit wrote on Sat, Jun 25, 2016 at 08:55:43AM +0200 >>>>> Le 24/06/2016 15:50, Dominique Asselineau a écrit : >>>>>> Je passe tout mes codes en Unicode (encodage UTF8) et je rencontre des >>>>>> difficultés avec DBI/DBD::MySQL. > Une présentation de Ricardo Signes au sujet d'unicode au dernier YAPC::NA > https://www.youtube.com/watch?v=TmTeXcEixEg > > Drôle et instructif. > -------------- section suivante -------------- Une pièce jointe autre que texte a été nettoyée... Nom: minc_charles.vcf Type: text/x-vcard Taille: 238 octets Desc: non disponible URL: From minc.charles at wanadoo.fr Wed Jun 29 17:16:28 2016 From: minc.charles at wanadoo.fr (minc) Date: Wed, 29 Jun 2016 17:16:28 +0200 Subject: [Perl] DBI DBD::MySQL et UTF-8 In-Reply-To: <20160628224638.GA2302@zok> References: <20160624135000.GA782@telecom-paristech.fr> <576E2AEF.4040307@gmail.com> <20160628124537.GA25696@telecom-paristech.fr> <57728B29.4030906@gmail.com> <20160628190319.GA30313@telecom-paristech.fr> <20160628224638.GA2302@zok> Message-ID: <74b12434-d685-be17-b0e6-207983cda180@wanadoo.fr> Le 29/06/2016 à 00:46, Philippe Bruhat (BooK) a écrit : > On Tue, Jun 28, 2016 at 09:03:19PM +0200, Dominique Asselineau wrote: >> Paul Gaborit wrote on Tue, Jun 28, 2016 at 04:35:21PM +0200 >>> Le 28/06/2016 14:45, Dominique Asselineau a écrit : >>>> Paul Gaborit wrote on Sat, Jun 25, 2016 at 08:55:43AM +0200 >>>>> Le 24/06/2016 15:50, Dominique Asselineau a écrit : >>>>>> Je passe tout mes codes en Unicode (encodage UTF8) et je rencontre des >>>>>> difficultés avec DBI/DBD::MySQL. Peut-être que mon expérience sur un script de backup peut donner des idées. En effet, bien que travaille en 'UTF-8' que mon script soit dans le même encodage, faisant appel à des commandes systèmes, je récupère selon les niveaux des réponses du CP-850 (system ($cmd ) = MS-DOS ) ou du latin1 ( systeme Win 7, codage filesystem en français avec les commandes Perl ) ! Cela marche, à condition de bien contrôler les flux d'entrée et de sortie en les codant et décodant à chaque étape d'E/S. Peut-être qu'il y a ce genre d'étapes masquées ou implicites dans le problème évoqué ? @++. Charles @++. -------------- section suivante -------------- Une pièce jointe autre que texte a été nettoyée... Nom: minc_charles.vcf Type: text/x-vcard Taille: 238 octets Desc: non disponible URL: From asseline at telecom-paristech.fr Wed Jun 29 17:56:45 2016 From: asseline at telecom-paristech.fr (Dominique Asselineau) Date: Wed, 29 Jun 2016 17:56:45 +0200 Subject: [Perl] DBI DBD::MySQL et UTF-8 In-Reply-To: <74b12434-d685-be17-b0e6-207983cda180@wanadoo.fr> References: <20160624135000.GA782@telecom-paristech.fr> <576E2AEF.4040307@gmail.com> <20160628124537.GA25696@telecom-paristech.fr> <57728B29.4030906@gmail.com> <20160628190319.GA30313@telecom-paristech.fr> <20160628224638.GA2302@zok> <74b12434-d685-be17-b0e6-207983cda180@wanadoo.fr> Message-ID: <20160629155645.GB10630@telecom-paristech.fr> minc wrote on Wed, Jun 29, 2016 at 05:16:28PM +0200 > > > Le 29/06/2016 à 00:46, Philippe Bruhat (BooK) a écrit : > >On Tue, Jun 28, 2016 at 09:03:19PM +0200, Dominique Asselineau wrote: > >>Paul Gaborit wrote on Tue, Jun 28, 2016 at 04:35:21PM +0200 > >>>Le 28/06/2016 14:45, Dominique Asselineau a écrit : > >>>>Paul Gaborit wrote on Sat, Jun 25, 2016 at 08:55:43AM +0200 > >>>>>Le 24/06/2016 15:50, Dominique Asselineau a écrit : > >>>>>>Je passe tout mes codes en Unicode (encodage UTF8) et je rencontre des > >>>>>>difficultés avec DBI/DBD::MySQL. > Peut-être que mon expérience sur un script de backup peut donner des idées. > > En effet, bien que travaille en 'UTF-8' que mon script soit dans le même > encodage, > faisant appel à des commandes systèmes, je récupère selon les niveaux des > réponses > du CP-850 (system ($cmd ) = MS-DOS ) ou du latin1 ( systeme Win 7, codage > filesystem en français avec les commandes Perl ) ! > > Cela marche, à condition de bien contrôler les flux d'entrée et de sortie en > les codant et décodant > à chaque étape d'E/S. C'est justement ce que je veux éviter de faire. J'ai quelques dizaines de milliers de lignes de code Perl à passer en UTF-8 et pour ce qui est des requêtes MySQL, je ne me vois pas faire des decode_utf8 sur chaque valeurs récupérées qui le nécessitent. La doc rappelée par Paul Gaborit est en effet claire. Les valeurs textuelles récupérées en UTF-8, devraient normalement être décodées automatiquement pour être placées dans des strings utf8. Et si on exécute DBI::data_string_desc dessus, pour le mot « ?uf » on devrait avoir quelque chose de la forme UTF8 on, non-ASCII, 3 characters 4 bytes or j'obtiens UTF8 off, non-ASCII, 4 characters 4 bytes à décoder donc. > > Peut-être qu'il y a ce genre d'étapes masquées ou implicites dans le > problème évoqué ? J'aimerais qu'elles soient justement implicites ... A+ Dominique --