[Perl] DBI DBD::MySQL et UTF-8

Dominique Asselineau asseline at telecom-paristech.fr
Ven 24 Juin 15:50:01 CEST 2016


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'] ) );

-- 


Plus d'informations sur la liste de diffusion Perl