DBD::MySQL et Unicode pour caractères japonais
Le
Jb Van Puyvelde
Hello,
j'aimerais insérer dans une table mysql des caractères japonais mais je
n'obtiens que des "trucs bizarres".
En gros, je voudrais découper une page html japonaise en petits morceaux,
les trier et insérer les N-premiers dans la table.
Pas de problème pour lire la page et afficher les morceaux à l'écran
grâce à l'utilisation du module Encode, seul l'insertion dans la table
pose problème. La table utilise bien évidemment le charset utf8,
coallition utf8_unicode_ci;
De ce que j'ai pu lire, DBI devrait supporter l'unicode, mais p-ê que
DBD::MySQL ne le gère pas. Bref, si vous avez des idées pour résoudre ce
problème, ça m'intéresse.
Merci d'avance,
Jb
# Je débute en Perl, donc n'hésitez pas à me faire des remarques
# sur le style, même si ce n'est pas ça qui m'intéresse principalement.
Use Encode;
my ($dbh,$file,$page,$del_useless_ngrams,$DocId);
my $del_useless_ngrams = decode('UTF-8', '[A-Za-z0-9 \(\)<>=].*');
sub ngram_indexer {
my (@ngrams, @sNgrams, $count);
my $query = "INSERT INTO Ngram_".$size."_".$quantity." VALUES ";
for(my $i=0; $i < length($page); $i++) {
my $chunk = substr($page, $i, $size);
if ($chunk && $chunk !~ m#$del_useless_ngrams#) {
push @ngrams, $chunk;
}
}
@sNgrams = sort @ngrams;
$count = 0;
foreach (@sNgrams) {
$query .= "(".$DocId.", ".$dbh->quote($_)."),";
$count++;
if($count == $quantity) {
last;
}
}
chop($query);
my $sth = $dbh->prepare("$query;");
$sth->execute();
}
j'aimerais insérer dans une table mysql des caractères japonais mais je
n'obtiens que des "trucs bizarres".
En gros, je voudrais découper une page html japonaise en petits morceaux,
les trier et insérer les N-premiers dans la table.
Pas de problème pour lire la page et afficher les morceaux à l'écran
grâce à l'utilisation du module Encode, seul l'insertion dans la table
pose problème. La table utilise bien évidemment le charset utf8,
coallition utf8_unicode_ci;
De ce que j'ai pu lire, DBI devrait supporter l'unicode, mais p-ê que
DBD::MySQL ne le gère pas. Bref, si vous avez des idées pour résoudre ce
problème, ça m'intéresse.
Merci d'avance,
Jb
# Je débute en Perl, donc n'hésitez pas à me faire des remarques
# sur le style, même si ce n'est pas ça qui m'intéresse principalement.
Use Encode;
my ($dbh,$file,$page,$del_useless_ngrams,$DocId);
my $del_useless_ngrams = decode('UTF-8', '[A-Za-z0-9 \(\)<>=].*');
sub ngram_indexer {
my (@ngrams, @sNgrams, $count);
my $query = "INSERT INTO Ngram_".$size."_".$quantity." VALUES ";
for(my $i=0; $i < length($page); $i++) {
my $chunk = substr($page, $i, $size);
if ($chunk && $chunk !~ m#$del_useless_ngrams#) {
push @ngrams, $chunk;
}
}
@sNgrams = sort @ngrams;
$count = 0;
foreach (@sNgrams) {
$query .= "(".$DocId.", ".$dbh->quote($_)."),";
$count++;
if($count == $quantity) {
last;
}
}
chop($query);
my $sth = $dbh->prepare("$query;");
$sth->execute();
}

Poser une question


DBD::Mysql semble effectivement "fâché" avec l'utf8.
Voir :
http://www.simplicidade.org/notes/a...bdmys.html
Tu peux aussi utiliser des patchs de DBD::Mysql
http://marc.info/?l=msql-mysql-modules&m1970179409036&w=2
ou utiliser UTF8DBI.
Voir maintenant si la version 5 de mysql ou la nouvelle version de
DBD::mysql n'intègre pas ce patch.
HTH.
--
HDL
Ces différentes solutions semblent fonctionner pour la lecture seulement.
Malgré l'énorme quantité de modules dispos, il n'y aurait rien en Perl
pour écrire en utf8 dans une base ? Dites moi que c'est pas vrai ;)
Jb
C'est pas vrai ! Chez moi, avec PostgreSQL et DBD::Pg, il n?y a aucun
probleme :)