Je pense que comme la plupart des utilisateurs de MySQL, il vous est arrivé de devoir changer l’encodage des caractères d’une base de données, d’une table ou pire, des champs et quel cauchemar …
Je viens de trouver un joli petit script php qui le fait assez proprement. Il suffit de renseigner le character_set initial, celui recherché, les identifiants de connexion à la base de données puis de lancer le script et enfin, d’exécuter les requêtes fournies :
#!/usr/bin/php
<?php
// FICHIER convertCharset.php
// this script will output the queries need to change all fields/tables to a different collation
// it is HIGHLY suggested you take a MySQL dump prior to running any of the generated
// this code is provided as is and without any warranty
set_time_limit(0);
// Connexion BDD
define("USER","username");
define("PASS",'password');
define("HOST","your_host_name");
define("DB",$argv[1]);
$path_tmp = "/tmp/";
$mysql_params = "-h ".HOST." -u ".USER." -p'".PASS."'";
// collation you want to change:
$convert_from = 'latin1_swedish_ci';
//$convert_from = 'utf8_unicode_ci';
// collation you want to change it to:
$convert_to = 'utf8_general_ci';
// character set of new collation:
$character_set= 'utf8';
$show_alter_table = true;
$show_alter_field = true;
// DB login information
mysql_connect(HOST, USER, PASS);
mysql_select_db(DB);
$rs_tables = mysql_query(" SHOW TABLES ") or die(mysql_error());
$sql = "";
while ($row_tables = mysql_fetch_row($rs_tables)) {
$table = mysql_real_escape_string($row_tables[0]);
// Alter table collation
// ALTER TABLE `account` DEFAULT CHARACTER SET utf8
if ($show_alter_table) {
$sql.= "ALTER TABLE `$table` DEFAULT CHARACTER SET $character_set;\r\n";
}
$rs = mysql_query(" SHOW FULL FIELDS FROM `$table` ") or die(mysql_error());
while ($row=mysql_fetch_assoc($rs)) {
if ($row['Collation']!=$convert_from)
continue;
// Is the field allowed to be null?
if ($row['Null']=='YES') {
$nullable = ' NULL ';
} else {
$nullable = ' NOT NULL';
}
// Does the field default to null, a string, or nothing?
if ($row['Default']=='NULL') {
$default = " DEFAULT NULL";
} else if ($row['Default']!='') {
$default = " DEFAULT '".mysql_real_escape_string($row['Default'])."'";
} else {
$default = '';
}
// Alter field collation:
// ALTER TABLE `account` CHANGE `email` `email` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
if ($show_alter_field) {
$field = mysql_real_escape_string($row['Field']);
$sql.= "ALTER TABLE `$table` CHANGE `$field` `$field` $row[Type] CHARACTER SET $character_set COLLATE $convert_to $nullable $default; \r\n";
}
}
}
system("mysqldump $mysql_params ".DB." > ".$path_tmp."before-conv-charset-".DB.".sql");
$fp = fopen($path_tmp.'conv-charset-'.DB.'.sql', 'w');
fwrite($fp, $sql);
fclose($fp);
system("mysql $mysql_params ".DB." < ".$path_tmp."conv-charset-".DB.".sql");
?>
Il ne reste plus qu’à exécuter le script :
php convertCharset.php DATABASE_NAME
Magie !