", _T('utf8_convert_timeout'), "
\n";
convert_sql_utf8($titre);
echo ""._T('utf8_convert_termine')."
";
effacer_meta('convert_sql_utf8');
// bouton "retour au site" + redirige_par_entete
echo "",
" >> ",
_T('icone_retour'),"
",
install_fin_html();
}
// http://doc.spip.org/@convert_sql_utf8
function convert_sql_utf8($titre){
define(_DEBUG_CONVERT, false);
$charset_spip = $GLOBALS['meta']['charset'];
$charset_supporte = false;
$utf8_supporte = false;
// verifier que mysql gere le charset courant pour effectuer les conversions
if ($c = sql_get_charset($charset_spip)){
$sql_charset = $c['charset'];
$sql_collation = $c['collation'];
$charset_supporte = true;
}
if (!$charset_supporte){
$res = spip_query("SHOW CHARACTER SET");
while ($row = sql_fetch($res)){
if ($row['Charset']=='utf8') $utf8_supporte = true;
}
echo install_debut_html($titre);
echo _L("Le charset SPIP actuel $charset_spip n'est pas supporte par votre serveur MySQL
"); # non traduit car complexe & obsolete
if ($utf8_supporte)
echo _L("Votre serveur supporte utf-8, vous devriez convertir votre site en utf-8 avant de recommencer cette operation");
echo install_fin_html();
} else {
echo _L("Charset Actuel du site SPIP : $charset_spip
");
echo _L("Conversion des champs des tables spip de type latin1 vers $sql_charset (collation $sql_collation)
");
// lister les collations et leur charset correspondant
$res = spip_query("SHOW COLLATION");
$charset2collations = array();
while ($row = sql_fetch($res)){
$charset2collations[$row['Collation']] = $row['Charset'];
}
$count = 0;
// lister les tables spip
include_spip('base/serial');
include_spip('base/auxiliaires');
$res = spip_query("SHOW TABLES");
while (($row = sql_fetch($res)) /*&& ($count<1)*/){
$nom = array_shift($row);
if (preg_match(',^'.$GLOBALS['table_prefix'].'_(.*)$,',$nom,$regs)){
$count++;
$nom = $regs[1];
echo "
$nom
";
// lister les champs de la table
$res2 = spip_query("SHOW FULL COLUMNS FROM spip_$nom");
while ($row2 = sql_fetch($res2)){
$collation = $row2['Collation'];
$champ = $row2['Field'];
if ($collation!="NULL"
&& isset($charset2collations[$collation])
&& $charset2collations[$collation]=='latin1'){
echo "Conversion de '$champ' depuis $collation (".$charset2collations[$collation]."):";
// conversion de latin1 vers le charset reel du contenu
$type_texte= $row2['Type'];
$type_blob = "blob";
if (strpos($type_texte,"text")!==FALSE)
$type_blob = str_replace("text","blob",$type_texte);
// sauf si blob expressement demande dans la description !
if ((
$a = $GLOBALS['tables_principales']['spip_'.$nom]['field'][$champ]
OR $a = $GLOBALS['tables_auxiliaires']['spip_'.$nom]['field'][$champ]
) AND preg_match(',blob,i', $a)) {
echo "On ignore le champ blob $nom.$champ
\n";
} else {
$default = $row2['Default']?(" DEFAULT ".sql_quote($row2['Default'])):"";
$notnull = ($row2['Null']=='YES')?"":" NOT NULL";
$q = "ALTER TABLE spip_$nom CHANGE $champ $champ $type_blob $default $notnull";
if (!_DEBUG_CONVERT)
$b = spip_query($q);
echo "$q
$b\n";
$q = "ALTER TABLE spip_$nom CHANGE $champ $champ $type_texte CHARACTER SET $sql_charset COLLATE $sql_collation $default $notnull";
if (!_DEBUG_CONVERT)
$b = spip_query($q);
echo "$q
\n";
}
}
}
// on ne change le charset par defaut de la table que quand tous ses champs sont convertis
$q = "ALTER TABLE spip_$nom DEFAULT CHARACTER SET $sql_charset COLLATE $sql_collation";
if (!_DEBUG_CONVERT)
$b = spip_query($q);
echo "$q
$b\n";
}
}
ecrire_meta('charset_sql_base',$sql_charset,'non');
ecrire_meta('charset_sql_connexion',$sql_charset,'non');
}
}
?>