web-dev-qa-db-fra.com

Comment convertir un jeu de caractères de base de données MySQL complet et un classement en UTF-8?

Comment puis-je convertir l'intégralité du jeu de caractères de la base de données MySQL en UTF-8 et le classement en UTF-8?

430
Dean

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 utilisez toujours MySQL 5.5.2 ou une version antérieure et ne prenant pas en charge le format UTF-8 à 4 octets, 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;
_
667
BalusC
  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, mais définit uniquement la valeur par défaut pour les tables nouvellement créées.

    ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;
    
  3. Ensuite, vous devrez convertir le jeu de caractères de toutes les tables existantes et de leurs colonnes. Cela suppose que vos données actuelles sont réellement dans le jeu de caractères actuel. Si vos colonnes sont définies sur un jeu de caractères mais que vos données sont réellement stockées dans un autre, vous devrez vérifier le manuel MySQL pour savoir comment le gérer.

    ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
    
121
newspire

Sur le shell en ligne de commande

Si vous êtes un shell en ligne de commande, vous pouvez le faire très rapidement. Il suffit de remplir "nom_base": 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"

One-Liner pour un copier/coller simple

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"
72

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 exécutez-la.

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

68
sdfor

Avant de continuer, assurez-vous que: Vous avez effectué une sauvegarde complète de la base de données!

Étape 1: Changements de niveau de base de données

  • Identifier le jeu de classement et 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%');
    
  • Correction du classement pour la base de données

    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    

Étape 2: Changements de niveau de table

  • Identification des tables de base de données avec un jeu de caractères ou un classement incorrect

    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%')
    
  • Ajuster le classement et le jeu de caractères des colonnes du tableau

Capturez la sortie SQL supérieure et exécutez-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; 

voir: https://confluence.atlassian.com/display/CONFKB/How+to+Fix+the+Collation+and+Character+Set+of+a+MySQL+Database

16
John Yin

Utilisez HeidiSQL . C'est gratuit et un très bon outil de base de données.

Dans le menu Outils, entrez Editeur de table en bloc.

Sélectionnez la base de données complète ou choisissez des tables à convertir,

  • cocher Modifier le classement par défaut: utf8mb4_general_ci
  • tick Convertir en jeu de caractères: utf8

Execute

Ceci convertit la base de données complète du latin en utf8 en seulement quelques secondes.

Fonctionne comme un charme :)

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

Le vrai piège lorsque l'on passe de latin à utf8 est de s'assurer que pdo se connecte au jeu de caractères utf8. Sinon, vous obtiendrez des données de déchets insérées dans la table utf8 et des points d'interrogation sur toute la surface de votre page Web, ce qui vous fera penser que les données de la table ne sont pas utf8 ...

7
Tom

Inspiré par le commentaire @sdfor, 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
6
Camoflame

Pour les bases de données contenant 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 à l'aide de 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
Dan Lucas

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

Si la colonne a un type de données non binaire (CHAR, VARCHAR, TEXT), son contenu doit être codé dans le jeu de caractères de la colonne, et non dans un autre jeu de caractères. Si le contenu est codé dans un jeu de caractères différent, vous pouvez d'abord convertir la colonne en utilisant un type de données binaire, puis en une colonne non binaire avec le jeu de caractères souhaité.

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 le bon classement, sinon vous pourriez avoir des conflits de clés uniques. par exemple. Éleanore et Eleanore pourraient être considérés comme identiques dans certaines collations.

De côté:

J'ai eu une situation où certains caractères "cassé" dans les emails, même s'ils étaient stockés comme UTF-8 dans la base de données. Si vous envoyez des courriels en utilisant des données utf8, vous voudrez peut-être également convertir vos courriels pour les envoyer en UTF8.

Dans PHPMailer, il suffit de mettre à jour cette ligne: public $CharSet = 'utf-8';

4
Frank Forte
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
Soumik Guha
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();
3
剑二十三

Le moyen le plus sûr consiste à modifier d'abord les colonnes en un type binaire, puis à le modifier à nouveau en utilisant le jeu de caractères souhaité.

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

  1. CHAR => BINARY
  2. TEXT => BLOB
  3. TINYTEXT => TINYBLOB
  4. MEDIUMTEXT => MEDIUMBLOB
  5. LONGTEXT => LONGBLOB
  6. VARCHAR => VARBINAIRE

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 tables latin1 et cela a gardé tous les signes diacritiques.

Vous pouvez extraire cette requête pour toutes les colonnes en procédant comme suit:

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 cela sur toutes vos colonnes, alors 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 toute votre 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 vos tables, faites la même chose dans la base de données:

ALTER DATABASE [DATA_BASE_NAME] CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci;
2
MalachiteBR

Si vous ne parvenez pas à convertir vos tables ou si votre table est toujours définie sur un jeu de caractères non-utf8, mais que vous voulez utf8, le mieux est de le supprimer, de recommencer et de spécifier explicitement:

create database database_name character set utf8;
1
user3013048

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
utapyngo

Vous pouvez également utiliser l'outil de base de données Navicat, qui le fait plus facilement.

  • Shiva.

Faites un clic droit sur votre base de données et sélectionnez Propriétés de la base de données et modifiez comme vous le souhaitez dans la liste déroulante.

enter image description here

0
rvsiva17

alter table nom_table charset = 'utf8';

Ceci est une requête simple que j'ai pu utiliser pour mon cas, vous pouvez changer le nom de la table selon vos besoins.

0
Aditya Seth

Pour changer le codage du jeu de caractères en UTF-8 pour la base de données elle-même, tapez la commande suivante dans mysql> Prompt. Remplacez DBNAME par le nom de la base de données:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;
0
Nyein Aung