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

97

Il existe un MySQL tablequi a cette définition tirée 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 charsetde ce tableau de latin1à utf8. Comment faire ça ?

phéromix
la source
3
Le nom correct pour "UTF8" dans MySQL est "utf8mb4" le jeu de caractères "utf8" est cassé, il ne prend en charge que 3 octets maximum. Voir le manuel mysql pour plus de détails, ou google "mysql" et "utf8" ... dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8.html
Samuel Åslund

Réponses:

203

Si vous souhaitez changer le tableau default character setet 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;

La requête sera donc:

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8;

la source
22
En revanche, si vous utilisez simplement la ALTER TABLE tbl CHARACTER SET utf8syntaxe suggérée par d'autres, vous ne modifierez que l'encodage par défaut pour table; les colonnes existantes ne seront pas converties comme elles le seront si vous utilisez cette réponse.
eaj
7
Si vous souhaitez appliquer cette modification à toutes les tables qui ne sont pas encodées en ut8 dans une base de données, vous pouvez utiliser cette requête et exécuter les requêtes résultantes: SELECT concat('alter table ', table_name, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') FROM information_schema.tables WHERE table_schema='<your_database_name>' and table_collation != 'utf8_general_ci' GROUP BY table_name;
Maxooo
3
cela ne change pas le jeu de caractères par défaut . pour changer la valeur par défaut, faites comme eak ditALTER TABLE tbl CHARACTER SET utf8
Accountant م
7
Je voudrais ajouter qu'en général, vous ne voulez pas utiliser utf8 mais utf8mb4 à la place pour obtenir ce que vous attendez d'utf8. Pour expliquer: dans MySQL utf8 est en réalité juste un sous-ensemble de utf8, qui serait mieux nommé utf8mb3. Il ne peut encoder que jusqu'à 3 octets de caractères utf8 au lieu des 4 octets maximum spécifiés. Cela signifie que de nombreux emoji ne seront pas encodables et seront simplement perdus si vous essayez de les écrire dans la base de données. Voir par exemple. medium.com/@adamhooper/… pour plus de détails.
dwt le
6
pour le multi-octet, vous pouvez utiliserALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
RN Kushwaha
18

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

ALTER TABLE etape_prospection
  CHARACTER SET utf8,
  COLLATE utf8_general_ci;

Pour modifier le jeu de caractères de la colonne de chaîne, exécutez cette requête:

ALTER TABLE etape_prospection
  CHANGE COLUMN etape_prosp_comment etape_prosp_comment TEXT CHARACTER SET utf8 COLLATE utf8_general_ci;
Devart
la source
10
Vous ne devriez jamais, jamais utiliser utf8_general_ci: cela ne fonctionne tout simplement pas. C'est un retour aux mauvais vieux jours de stooopeeedity ASCII d'il y a cinquante ans. La correspondance Unicode insensible à la casse ne peut pas être effectuée sans la carte foldcase de l'UCD. Par exemple, «Σίσυφος» contient trois sigmas différents; ou comment la minuscule de «TSCHüẞ» est «tschüβ», mais la majuscule de «tschüβ» est «TSCHÜSS». Vous pouvez avoir raison ou vous pouvez être rapide. Par conséquent, vous devez utiliser utf8_unicode_ci, car si vous ne vous souciez pas de l'exactitude, alors il est trivial de le rendre infiniment rapide.
Yohanes AI
1
Le jeu de caractères MySQL UTF8 est cassé, vous devez utiliser utf8mb4!
Samuel Åslund
5

La ALTER TABLEcommande MySQL devrait faire l'affaire. La commande suivante changera 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 convertit toutes les colonnes de type texte du tableau dans le nouveau jeu de caractères. Les jeux de caractères utilisent différentes quantités de données par caractère, donc MySQL convertira le type de certaines colonnes pour s'assurer qu'il y a suffisamment de place pour contenir le même nombre de caractères que l'ancien type de colonne.

Je vous recommande de lire la documentation ALTER TABLE MySQL avant de modifier des données en direct.

piersadrian
la source
1
Oui, cela fait l'affaire, mais une chose est différente avec la méthode de conversion : elle ne peut pas supprimer automatiquement l'ancienne option charset des colonnes.
tech_me
3

Si quelqu'un recherche une solution complète pour modifier le jeu de caractères par défaut pour toutes les tables de base de données et convertir les données, il peut en être une:

DELIMITER $$

CREATE PROCEDURE `exec_query`(IN sql_text VARCHAR(255))
BEGIN
  SET @tquery = `sql_text`;
  PREPARE `stmt` FROM @tquery;
  EXECUTE `stmt`;
  DEALLOCATE PREPARE `stmt`;
END$$

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() AND `table_type` = 'BASE TABLE';
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;
CALL `exec_query`(CONCAT(
  'ALTER TABLE `',
  tab_name,
  '` CONVERT TO CHARACTER SET ',
  QUOTE(charset),
  ' COLLATE ',
  QUOTE(collation),
  ';'
));
CALL `exec_query`(CONCAT('REPAIR TABLE `', tab_name, '`;'));
CALL `exec_query`(CONCAT('OPTIMIZE TABLE `', tab_name, '`;'));
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.sqlet l'exécuter par exemple en l'appelant depuis le terminal MySQL:

SOURCE ~/path-to-the-file/chg_char_set.sql

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

CALL change_character_set('utf8mb4', 'utf8mb4_bin');

Une fois que vous avez testé les résultats, vous pouvez supprimer ces procédures stockées:

DROP PROCEDURE `change_character_set`;
DROP PROCEDURE `exec_query`;
milijan
la source
Il manque une condition qui nous amène également à sélectionner des vues. C'est WHERE table_schema = DATABASE (); => WHERE table_schema = DATABASE () AND table_type = 'BASE TABLE'; Mais merci!! C'est de quoi j'ai besoin!
nguyenhoai890
2

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

La modification du jeu de caractères d'une colonne signifie uniquement qu'elle pourra stocker une plus large gamme de caractères. Votre application communique avec la base de données à l'aide du client mysql, vous devrez peut-être également modifier l'encodage du client.

Joni
la source
Je le ferais sans le clavier limité de l'iPod touch :-)
Joni
eh bien l'iPod Touch / iPhone doit avoir quelques inconvénients. :-P Je n'ai jamais réalisé qu'ils manquaient jusqu'à ce que vous le mentionniez. ;-)
Aufwind
Maintenez le bouton du caractère de citation enfoncé pour voir le caractère de citation arrière.
Chloe