300 votes

Comment modifier la collation d'une base de données, d'une table ou d'une colonne ?

La base de données est latin1_general_ci et je veux changer la collation en utf8mb4_general_ci .

Existe-t-il un paramètre dans PhpMyAdmin permettant de modifier la collation de la base de données, de la table, de la colonne ? Plutôt que de changer une à une ?

4 votes

La réponse se trouve ici : stackoverflow.com/questions/5906585/

5voto

Adam Nofsinger Points 1680

J'ai été surpris d'apprendre, et j'ai donc dû revenir ici pour le signaler, que l'excellent et bien entretenu Interconnect/it SAFE SEARCH AND REPLACE ON DATABASE script a quelques options pour convertir les tables en utf8 / unicode, et même pour les convertir en innodb. C'est un script couramment utilisé pour migrer une base de données d

interconnect script buttons

4voto

András Ottó Points 3967

J'ai lu ici qu'il fallait convertir chaque table manuellement, ce qui n'est pas vrai. Voici une solution pour le faire avec une procédure stockée :

DELIMITER $$

DROP PROCEDURE IF EXISTS changeCollation$$

-- character_set parameter could be 'utf8'
-- or 'latin1' or any other valid character set
CREATE PROCEDURE changeCollation(IN character_set VARCHAR(255))
BEGIN
DECLARE v_finished INTEGER DEFAULT 0;
DECLARE v_table_name varchar(255) DEFAULT "";
DECLARE v_message varchar(4000) DEFAULT "No records";

-- This will create a cursor that selects each table,
-- where the character set is not the one
-- that is defined in the parameter

DECLARE alter_cursor CURSOR FOR SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
AND COLLATION_NAME NOT LIKE CONCAT(character_set, '_%');

-- This handler will set the value v_finished to 1
-- if there are no more rows

DECLARE CONTINUE HANDLER
FOR NOT FOUND SET v_finished = 1;

OPEN alter_cursor;

-- Start a loop to fetch each rows from the cursor
get_table: LOOP

-- Fetch the table names one by one
FETCH alter_cursor INTO v_table_name;

-- If there is no more record, then we have to skip
-- the commands inside the loop
IF v_finished = 1 THEN
LEAVE get_table;
END IF;

IF v_table_name != '' THEN

IF v_message = 'No records' THEN
SET v_message = '';
END IF;

-- This technic makes the trick, it prepares a statement
-- that is based on the v_table_name parameter and it means
-- that this one is different by each iteration inside the loop

SET @s = CONCAT('ALTER TABLE ',v_table_name,
' CONVERT TO CHARACTER SET ', character_set);
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SET v_message = CONCAT('The table ', v_table_name ,
' was changed to the default collation of ', character_set,
'.\n', v_message);

SET v_table_name = '';

END IF;
-- Close the loop and the cursor
END LOOP get_table;
CLOSE alter_cursor;

-- Returns information about the altered tables or 'No records'
SELECT v_message;

END $$

DELIMITER ;

Une fois la procédure créée, appelez-la simplement :

CALL changeCollation('utf8');

Pour plus de détails, lisez ceci blog .

4voto

Chandra Kumar Points 3205

Vous pouvez simplement ajouter ce code au fichier script.

//Database Connection
$host = 'localhost';
$db_name = 'your_database_name';
$db_user =  'your_database_user_name';
$db_pass = 'your_database_user_password';

$con = mysql_connect($host,$db_user,$db_pass);

if(!$con) { echo "Cannot connect to the database ";die();}

  mysql_select_db($db_name);

  $result=mysql_query('show tables');

  while($tables = mysql_fetch_array($result)) {
    foreach ($tables as $key => $value) {
    mysql_query("ALTER TABLE $value CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");
  }
}

echo "The collation of your database has been successfully changed!";

2voto

Mircea Stanciu Points 504

I

 ALTER SCHEMA MYSCHEMA DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci;

0voto

kickoff3pm Points 1

Méthode rapide : exporter vers un fichier SQL, utiliser la fonction de recherche et de remplacement pour modifier le texte à changer. Créez une nouvelle base de données, importez les données, puis renommez l'ancienne base de données et la nouvelle sous l'ancien nom.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X