Comment convertir un jeu de caractères MySQL et collation en UTF-8?

Comment puis-je convertir l'ensemble des caractères de la base de données MySQL en UTF-8 et collation en UTF-8?

378
demandé sur Nanne 2011-05-24 23:12:51

17 réponses

utilisez les commandes ALTER DATABASE et ALTER TABLE .

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

ou si vous êtes encore sur MySQL 5.5.2 ou plus ancien qui ne supporte pas 4 octets UTF-8, utilisez utf8 au lieu de utf8mb4 :

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
585
répondu BalusC 2017-01-06 17:30:32
  1. faites une sauvegarde!

  2. ensuite, vous devez définir les jeux de caractères par défaut sur la base de données. Cela ne convertit pas les tables existantes, il définit seulement la valeur par défaut pour les tables nouvellement créées.

    ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;
    
  3. ensuite, vous aurez besoin de convertir le jeu de caractères sur toutes les tables existantes et leurs colonnes. Cela suppose que vos données actuelles sont effectivement dans le actuel char. Si vos colonnes sont définies à un jeu de caractères mais que vos données sont réellement stockées dans un autre, alors vous devrez vérifier le manuel MySQL sur la façon de gérer cela.

    ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
    
116
répondu newspire 2016-02-19 10:36:38

sur le shell de commande

si vous êtes un shell en ligne de commande, vous pouvez le faire très rapidement. Il suffit de remplir "dbname": d

DB="dbname"
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'
    mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;'
) \
| mysql "$DB"

une doublure pour simple copier / coller

DB="dbname"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'; mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) | mysql "$DB"
70
répondu Jasny - Arnold Daniels 2014-08-05 12:04:30

vous pouvez créer le sql pour mettre à jour toutes les tables avec:

SELECT CONCAT("ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CHARACTER SET utf8 COLLATE utf8_general_ci;   ",
    "ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  ") 
    AS alter_sql
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = your_database_name;

Capturez la sortie et lancez-la.

la réponse d'Arnold Daniels ci-dessus est plus élégante.

63
répondu sdfor 2013-10-10 17:02:35

avant de procéder, assurez-vous que vous: avez terminé une sauvegarde complète de la base de données!

Étape 1: Changements Au Niveau De La Base De Données

  • identifier la Collation et le jeu de caractères de votre base de données

    SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM 
    information_schema.SCHEMATA S
    WHERE schema_name = 'your_database_name'
    AND
    (DEFAULT_CHARACTER_SET_NAME != 'utf8'
        OR
     DEFAULT_COLLATION_NAME not like 'utf8%');
    
  • fixation de la collecte pour la base de données

    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    

Étape 2: Modifications Du Niveau Du Tableau

  • identifier les Tables de base de données avec le jeu de caractères ou la collation incorrecte

    SELECT CONCAT(
    'ALTER TABLE ',  table_name, ' CHARACTER SET utf8 COLLATE utf8_general_ci;  ', 
    'ALTER TABLE ',  table_name, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  ')
    FROM information_schema.TABLES AS T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` AS C
    WHERE C.collation_name = T.table_collation
    AND T.table_schema = 'your_database_name'
    AND
    (C.CHARACTER_SET_NAME != 'utf8'
        OR
     C.COLLATION_NAME not like 'utf8%')
    
  • tableau D'ajustement colonne " compilation et jeu de caractères

Capturez la sortie sql supérieure et lancez-la. (comme suit)

ALTER TABLE rma CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_history CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_products CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_products CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_report_period CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_report_period CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_reservation CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_reservation CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return_history CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return_product CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return_product CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

se référer à: https://confluence.atlassian.com/display/CONFKB/How+to+Fix+the+Collation+and+Character+Set+of+a+MySQL+Base de données

14
répondu John Yin 2015-07-08 07:08:29

Use HeidiSQL . Son libre et un très bon outil db.

dans le menu outils, entrez en Vrac éditeur de table

sélectionner la base de données complète ou choisir des tables à convertir,

  • tique Changement de classement par défaut: utf8mb4_general_ci
  • tick Convert en charset: utf8

Exécuter

cette conversion de base de données complète du latin à l'utf8 en seulement quelques secondes.

Fonctionne comme un charme :)

HeidiSQL se connecte par défaut comme utf8 de sorte que tous les caractères spéciaux doivent maintenant être considérés comme le caractère (æ ø å) et non pas comme encodé lors de l'inspection des données de la table.

le véritable écueil lors du passage du latin à l'utf8 est de s'assurer que pdo se connecte avec le jeu de caractères utf8. Si pas, vous obtiendrez des ordures données insérées à l'utf8 table et des points d'interrogation partout sur votre page web, ce qui vous fait penser que les données de table n'est pas utf8...

7
répondu Tom 2014-12-30 14:04:08

inspiré par @sdfor comment, voici un script bash qui fait le travail""

#!/bin/bash

printf "### Converting MySQL character set ###\n\n"

printf "Enter the encoding you want to set: "
read -r CHARSET

# Get the MySQL username
printf "Enter mysql username: "
read -r USERNAME

# Get the MySQL password
printf "Enter mysql password for user %s:" "$USERNAME"
read -rs PASSWORD

DBLIST=( mydatabase1 mydatabase2 )

printf "\n"


for DB in "${DBLIST[@]}"
do
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE `'"$CHARSET"'`;'
    mysql "$DB" -u"$USERNAME" -p"$PASSWORD" -e "SHOW TABLES" --batch --skip-column-names \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE `'"$CHARSET"'`;'
) \
| mysql "$DB" -u"$USERNAME" -p"$PASSWORD"

echo "$DB database done..."
done

echo "### DONE ###"
exit
5
répondu Camoflame 2015-03-20 07:20:39

dans le cas où les données ne sont pas dans le même jeu de caractères, vous pourriez considérer cet extrait de http://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html

si la colonne a un type de données nonbinary (CHAR, VARCHAR, TEXT), son le contenu doit être encodé dans le jeu de caractères de la colonne, pas dans un autre jeu de caractères. Si le contenu est encodé dans un caractère différent ensemble, vous pouvez convertir la colonne à utiliser un binaire de données d'abord, et puis à une colonne nonbinary avec le jeu de caractères désiré.

voici un exemple:

 ALTER TABLE t1 CHANGE c1 c1 BLOB;
 ALTER TABLE t1 CHANGE c1 c1 VARCHAR(100) CHARACTER SET utf8;

assurez-vous de choisir la bonne collation, ou vous pourriez obtenir des conflits Clés uniques. par exemple Éleanore et Eleanore peuvent être considérés comme les mêmes dans certaines collations.

à part:

j'ai eu une situation où certains caractères "cassé" dans les e-mails bien qu'ils aient été stockés comme UTF-8 dans la base de données. Si vous envoyez des e-mails en utilisant des données utf8, vous pouvez également convertir vos e-mails à envoyer en UTF8.

dans PHPMailer, mettez à jour cette ligne: public $CharSet = 'utf-8';

4
répondu Frank Forte 2014-12-04 16:34:44

pour les bases de données qui ont un nombre élevé de tables, vous pouvez utiliser un simple script php pour mettre à jour le jeu de caractères de la base de données et de toutes les tables en utilisant ce qui suit:

$conn = mysqli_connect($host, $username, $password, $database);

if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

$alter_database_charset_sql = "ALTER DATABASE ".$database." CHARACTER SET utf8 COLLATE utf8_unicode_ci";
mysqli_query($conn, $alter_database_charset_sql);

$show_tables_result = mysqli_query($conn, "SHOW TABLES");
$tables  = mysqli_fetch_all($show_tables_result);

foreach ($tables as $index => $table) {
  $alter_table_sql = "ALTER TABLE ".$table[0]." CONVERT TO CHARACTER SET utf8  COLLATE utf8_unicode_ci";
  $alter_table_result = mysqli_query($conn, $alter_table_sql);
  echo "<pre>";
  var_dump($alter_table_result);
  echo "</pre>";
}
4
répondu Dan Lucas 2015-01-30 19:26:42
mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql
cp dump.sql dump-fixed.sql
vim dump-fixed.sql


:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq

mysql -uusername -ppassword < dump-fixed.sql
3
répondu Soumik Guha 2016-01-10 19:06:04

si vous ne pouvez pas convertir vos tables ou si votre table est toujours définie à un jeu de caractères non-utf8, mais que vous voulez utf8, votre meilleur pari pourrait être de l'effacer et recommencer et spécifier explicitement:

create database database_name character set utf8;
1
répondu user3013048 2013-11-20 12:54:29

la seule solution qui a fonctionné pour moi: http://docs.moodle.org/23/en/Converting_your_MySQL_database_to_UTF8

conversion d'une base de données contenant des tables

mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql

cp dump.sql dump-fixed.sql
vim dump-fixed.sql

:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq

mysql -uusername -ppassword < dump-fixed.sql
0
répondu utapyngo 2014-07-09 08:52:04

alter table nom_table charset = "utf8";

C'est une requête simple, j'ai pu utiliser pour mon cas, vous pouvez modifier la table_name selon votre condition(s).

0
répondu Aditya Seth 2015-03-23 12:17:12

pour changer L'encodage du jeu de caractères en UTF-8 pour la base de données elle-même, tapez la commande suivante à l'invite mysql>. Remplacer DBNAME par le nom de la base de données:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;
0
répondu Nyein Aung 2016-01-25 07:09:50
DELIMITER $$  

CREATE PROCEDURE `databasename`.`update_char_set`()  

BEGIN  
 DECLARE done INT DEFAULT 0;  
 DECLARE t_sql VARCHAR(256);  
 DECLARE tableName VARCHAR(128);  
 DECLARE lists CURSOR FOR SELECT table_name FROM `information_schema`.`TABLES` WHERE table_schema = 'databasename';  
 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;  
 OPEN lists;  
 FETCH lists INTO tableName;  
 REPEAT  
    SET @t_sql = CONCAT('ALTER TABLE ', tableName, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci');  
    PREPARE stmt FROM @t_sql;  
    EXECUTE stmt;  
    DEALLOCATE PREPARE stmt;  
 FETCH lists INTO tableName;  
 UNTIL done END REPEAT;  
 CLOSE lists;  
END$$  

DELIMITER ;  

CALL databasename.update_char_set();
0
répondu 剑二十三 2018-06-21 04:47:12

le moyen le plus sûr est de modifier les colonnes d'abord à un type binaire et ensuite le modifier de nouveau à ce type en utilisant le jeu de caractères désiré.

chaque type de colonne a son type binaire respectif, comme suit:

  1. CHAR = > BINAIRE
  2. TEXT = > BLOB
  3. TINYTEXT = > TINYBLOB
  4. MEDIUM TEXT = > MEDIUMBLOB
  5. LONGTEXT => LONGBLOB
  6. VARCHAR = > VARBINARY

par exemple.:

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARBINARY;

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARCHAR(140) CHARACTER SET utf8mb4;

j'ai essayé dans plusieurs tableaux latin1 et il a gardé toutes les diacritiques.

vous pouvez extraire cette requête pour toutes les colonnes faisant ceci:

SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' VARBINARY;'),
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' ', COLUMN_TYPE,' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM information_schema.columns
WHERE TABLE_SCHEMA IN ('[TABLE_SCHEMA]')
AND COLUMN_TYPE LIKE 'varchar%'
AND (COLLATION_NAME IS NOT NULL AND COLLATION_NAME NOT LIKE 'utf%');

après avoir fait ceci sur toutes vos colonnes puis vous le faites sur toutes les tables:

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

Pour générer cette requête pour tous vos table, utilisez la requête suivante:

SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_COLLATION NOT LIKE 'utf8%'
and TABLE_SCHEMA in ('[TABLE_SCHEMA]');

et maintenant que vous avez modifié toutes vos colonnes et tables, faites la même chose sur la base de données:

ALTER DATABASE [DATA_BASE_NAME] CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci;
0
répondu MalachiteBR 2018-06-21 05:07:59

vous pouvez également DB tool Navicat, qui le fait plus facile.

  • Siva.

faites un clic droit sur votre base de données et sélectionnez Propriétés de la base de données et changez comme vous le souhaitez dans Drop Down

enter image description here

-1
répondu rvsiva17 2016-06-28 11:19:20