web-dev-qa-db-fra.com

Comment changer le jeu de caractères par défaut d'une table MySQL?

Il existe une MySQL table dont la définition est extraite de SQLYog Enterprise:

Table              Create Table                                             
-----------------  ---------------------------------------------------------
etape_prospection  CREATE TABLE `etape_prospection` (                       
                     `etape_prosp_id` int(10) NOT NULL AUTO_INCREMENT,      
                     `type_prosp_id` int(10) NOT NULL DEFAULT '0',          
                     `prosp_id` int(10) NOT NULL DEFAULT '0',               
                     `etape_prosp_date` datetime DEFAULT NULL,              
                     `etape_prosp_comment` text,                            
                     PRIMARY KEY (`etape_prosp_id`),                        
                     KEY `concerne_fk` (`prosp_id`),                        
                     KEY `de_type_fk` (`type_prosp_id`)                     
                   ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1  

Je veux changer le default charset de cette table de latin1 à utf8. Comment faire ça ?

66
pheromix

Si vous souhaitez modifier la table default character set et toutes les colonnes de caractères en un nouveau jeu de caractères, utilisez une instruction comme celle-ci: 

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

Donc la requête sera:

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8;
161
user319198

Changer le jeu de caractères par défaut de la table:

ALTER TABLE etape_prospection
  CHARACTER SET utf8,
  COLLATE utf8_general_ci;

Pour changer le jeu de caractères de colonne string, exceute cette requête:

ALTER TABLE etape_prospection
  CHANGE COLUMN etape_prosp_comment etape_prosp_comment TEXT CHARACTER SET utf8 COLLATE utf8_general_ci;
16
Devart

La commande ALTER TABLE MySQL devrait faire l'affaire. La commande suivante modifiera le jeu de caractères par défaut de votre table et le jeu de caractères de toutes ses colonnes en UTF8.

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

Cette commande convertira toutes les colonnes de type tableau de la table dans le nouveau jeu de caractères. Les jeux de caractères utilisent différentes quantités de données par caractère. MySQL convertit le type de certaines colonnes afin de garantir un espace suffisant pour le même nombre de caractères que l'ancien type de colonne.

Je vous recommande de lire le ALTER TABLE Documentation de MySQL avant de modifier des données actives.

5
piersadrian

Vous pouvez modifier la valeur par défaut avec un alter table set default charset mais cela ne changera pas le jeu de caractères des colonnes existantes. Pour changer cela, vous devez utiliser un alter table modify column

Changer le jeu de caractères d’une colonne signifie seulement qu’elle pourra stocker une plus grande gamme de caractères. Votre application communique avec la base de données à l’aide du client mysql; 

2
Joni

Si quelqu'un recherche une solution complète pour modifier le jeu de caractères par défaut pour toutes les tables de la base de données et convertir les données, il peut s'agir de l'une des solutions suivantes:

DELIMITER $$

CREATE PROCEDURE change_character_set(in charset VARCHAR(64), in collation VARCHAR(64))
BEGIN
DECLARE done BOOLEAN DEFAULT false;
DECLARE tab_name VARCHAR(64);
DECLARE charset_cursor CURSOR FOR 
    SELECT table_name FROM information_schema.tables
    WHERE table_schema = DATABASE();
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

SET foreign_key_checks = 0;
OPEN charset_cursor;
change_loop: LOOP
FETCH charset_cursor INTO tab_name;
IF done THEN
    LEAVE change_loop;
END IF;
SET @alter = concat('ALTER TABLE ', tab_name,
                    ' CONVERT TO CHARACTER SET ', charset,
                    ' COLLATE ', collation , ';');
SELECT @alter;
PREPARE stmt FROM @alter;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP change_loop;
CLOSE charset_cursor;
SET foreign_key_checks = 1;
END$$

DELIMITER ;

Vous pouvez placer ce code dans le fichier, par exemple. chg_char_set.sql et l'exécuter par exemple en l'appelant depuis le terminal MySQL:

mysql> source ~/path-to-the-file/chg_char_set.sql

Appelez ensuite une procédure définie avec les paramètres d'entrée souhaités, par exemple.

mysql> change_character_set('utf8mb4', 'utf8mb4_general_ci');
0
milijan