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/

18voto

Sel Points 21

Génère une requête pour mettre à jour chaque table et chaque colonne de chaque table. J'ai déjà utilisé cette méthode pour certains de mes projets et j'ai pu résoudre la plupart de mes problèmes de COLLATION. (en particulier pour les JOINTS)

Pour l'utiliser, il suffit d'exporter les résultats dans un texte délimité (probablement une nouvelle ligne ' \n ')

CHAQUE TABLE

SELECT CONCAT('ALTER TABLE `', TABLE_NAME, 
              '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;') 
       AS 'USE `DATABASE_NAME`;' 
FROM   INFORMATION_SCHEMA.TABLES 
WHERE  TABLE_SCHEMA = 'DATABASE_NAME' 
       AND TABLE_TYPE LIKE 'BASE TABLE' 

CHAQUE COLONNE

SELECT CONCAT('ALTER TABLE `', TABLE_NAME, '` MODIFY COLUMN `', COLUMN_NAME,'` ', 
              DATA_TYPE, IF(CHARACTER_MAXIMUM_LENGTH IS NULL 
       OR DATA_TYPE LIKE 'longtext', '', CONCAT('(', CHARACTER_MAXIMUM_LENGTH, 
                                         ')') 
       ), ' COLLATE utf8mb4_unicode_ci;') AS 'USE `DATABASE_NAME`;' 
FROM   INFORMATION_SCHEMA.COLUMNS 
WHERE  TABLE_SCHEMA = 'DATABASE_NAME' 
       AND (SELECT INFORMATION_SCHEMA.TABLES.TABLE_TYPE 
            FROM   INFORMATION_SCHEMA.TABLES 
            WHERE  INFORMATION_SCHEMA.TABLES.TABLE_SCHEMA = 
                   INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA 
                   AND INFORMATION_SCHEMA.TABLES.TABLE_NAME = 
                       INFORMATION_SCHEMA.COLUMNS.TABLE_NAME 
            LIMIT  1) LIKE 'BASE TABLE' 
       AND DATA_TYPE IN ( 'char', 'varchar' ) /* include other types if necessary */

12voto

Si vous lancez phpMyAdmin >> sélectionnez la base de données >> sélectionnez la table >> allez dans l'onglet "Opérations" >> dans la section "Options de la table" >> vous pouvez choisir Collation dans la liste déroulante >> et une fois que vous appuyez sur {Go} en haut de l'écran, vous verrez un message :

Votre requête SQL a été exécutée avec succès

et un script.

ALTER TABLE `tableName` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci 

Mais il ne modifiera PAS les collations des colonnes existantes. Pour ce faire, vous pouvez utiliser ce script (celui-ci provient également de phpMyAdmin)

ALTER TABLE  `tableName` CHANGE  `Name`  `Name` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL

9voto

andersonbd1 Points 1602

Vous pouvez définir la collation par défaut à plusieurs niveaux :

http://dev.mysql.com/doc/refman/5.0/en/charset-syntax.html

1) client 2) serveur par défaut 3) base de données par défaut 4) table par défaut 5) colonne

8voto

Dzintars Points 113

J

SELECT CONCAT("ALTER TABLE ", TABLE_SCHEMA, '.', TABLE_NAME," COLLATE utf8_general_ci;") AS    ExecuteTheString
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA="databaseName"
AND TABLE_TYPE="BASE TABLE";

5voto

mtmehdi Points 41

Vous pouvez changer le CHARSET et la COLLATION de toutes vos tables via PHP script comme suit. J'aime bien la réponse de hkasera mais le problème est que la requête s'exécute deux fois sur chaque table. Ce code est presque le même sauf qu'il utilise MySqli au lieu de mysql et empêche la double interrogation. Si j'avais pu voter pour la réponse de hkasera, je l'aurais fait.

<?php
$conn1=new MySQLi("localhost","user","password","database");
if($conn1->connect_errno){
    echo mysqli_connect_error();
    exit;
}
$res=$conn1->query("show tables") or die($conn1->error);
while($tables=$res->fetch_array()){
    $conn1->query("ALTER TABLE $tables[0] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci") or die($conn1->error);
}
echo "The collation of your database has been successfully changed!";

$res->free();
$conn1->close();

?>

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