MYSQL – Importer des données en latin dans une base en utf8

Une petite astuce que je viens de découvrir et qui me sauve la vie !

Problème : J’ai une base en latin1 et une réplication en utf8. Comment migrer les données de l’une vers l’autre en ligne de commande (sur deux serveurs de version totalement différentes) ?

Solution :

# on dump la base initiale en latin1
mysqldump -h host1 -u login -p'password' database > save.sql
# on importe les données dans la nouvelle base en utf8
mysql -h host2 -u login -p'password' --default_character_set utf8 database < save.sql

Petit mais costaud !

MYSQL – Modifier le character set de tous les champs/tables d’une database

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 !