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


459

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?


22
Pour les visiteurs ultérieurs: notez les questions connexes dans la barre latérale et utilisez utf8_unicode_ci, non utf8_general_ci.
fuxia

14
Si vous voulez une prise en charge complète de l'UTF-8, vous voudrez probablement aussi utiliser un jeu de caractères utf8mb4plutôt que utf8de utf8ne prendre en charge que le plan multilingue de base par opposition à la gamme complète. Il nécessite MySQL 5.5.3 ou supérieur.
Martin Steel du

4
J'ai oublié de mentionner dans mon commentaire ci-dessus, si vous passez à, utf8mb4vous devrez également basculer le classement surutf8mb4_unicode_ci
Martin Steel

3
Encore mieux, le classement utf8mb4_unicode_520_ciou la dernière version disponible.
Rick James

@MartinSteel Je pense que c'est le classement par défaut avec ce jeu de caractères.
VaTo

Réponses:


715

Utilisez les commandes ALTER DATABASEet 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 qui ne prend pas en charge l'UTF-8 à 4 octets, utilisez utf8plutôt utf8mb4:

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

12
La CONVERT TOtechnique suppose que le texte a été correctement stocké dans un autre jeu de caractères (par exemple, latin1), et non mutilé (comme les octets UTF-8 entassés dans la colonne latin1 sans conversion en latin1).
Rick James

1
Cela reconstruit la table, la rendant irréalisable sur les grands systèmes de production. S'il est certain que seuls les caractères ASCII sont stockés dans les colonnes latin1, est-il possible de changer le jeu de caractères / classement de table sans reconstruire?
Andrew

@Andrew Les grands systèmes de production ont généralement une base de données en miroir pour la maintenance.
BalusC

1
changer le caractère défini sur utf8 change mon type de données du texte au texte moyen. Est-ce attendu?
Jerry

1
@Jerry Probablement, car: "Si la colonne est convertie en utf8, chaque caractère peut nécessiter jusqu'à trois octets, pour une longueur maximale possible de 3 × 65 535 = 196 605 octets. Cette longueur ne tient pas dans les octets de longueur d'une colonne TEXTE, donc MySQL convertit le type de données en MEDIUMTEXT, qui est le plus petit type de chaîne pour lequel les octets de longueur peuvent enregistrer une valeur de 196 605. De même, une colonne VARCHAR peut être convertie en MEDIUMTEXT. " Modification du jeu de caractères
jabbascript

129
  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 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 sur toutes les tables existantes et leurs colonnes. Cela suppose que vos données actuelles se trouvent 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 consulter le manuel MySQL pour savoir comment gérer cela.

    ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

44
Remarque: ALTER TABLE nom_table CHARACTER SET utf8 définit uniquement le jeu de caractères par défaut sur une table qui est utilisée pour les colonnes nouvellement créées. Il ne convertit pas les colonnes existantes qui ont déjà un jeu de caractères.
Newspire

J'aurais dû lire la sauvegarde sauvegarde sauvegarde d'abord ... mais ma chance était que c'était sur l'environnement de développement. alors mon vote positif va à vous!
DominikAngerer

4
@DominikAngerer: Qu'est-ce qui a éclaté?
cic

16
Notez que ce utf8_general_cin'est plus la meilleure pratique recommandée. Depuis MySQL 5.5.3, vous devriez utiliser utf8mb4plutôt que utf8. Ils se réfèrent tous deux à l'encodage UTF-8, mais l'ancien utf8avait une limitation spécifique à MySQL empêchant l'utilisation des caractères numérotés ci-dessus 0xFFFD.
u01jmg3

76

Sur le shell de ligne de commande

Si vous êtes un shell de ligne de commande, vous pouvez le faire très rapidement. Remplissez simplement "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 un 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"

2
Pouvez-vous mettre plus de détails dans ce que je reçoisERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DB="dbname"
steros

@ 4485670 Vous devez l'exécuter sur le shell de ligne de commande . Si vous ne disposez que de la connexion client MySQL, utilisez le code de sdfor ci-dessous.
Arnold Daniels

6
Ce code fonctionne très bien, n'oubliez pas d'ajouter -h [nom d'hôte] -u [nom d'utilisateur] -p [mot de passe] après mysql si nécessaire.
disperse

3
Vous voudrez probablement désactiver les vérifications de clés étrangères sur un système réel: DB="db_name"; ( echo 'ALTER DATABASE '"$ DB"' `CHARACTER SET utf8 COLLATE utf8_general_ci; '; mysql --uuser -ppassword -hhost "$ DB" -e "SHOW TABLES" --batch --skip-column-names | xargs -I {} echo 'SET foreign_key_checks = 0; ALTER TABLE '{}'CONVERT EN CARACTER SET SET utf8 COLLATE utf8_general_ci; ' ) | mysql -uuser -ppassword -hhost "$ DB" `
Adam Nelson

1
Cela n'a pas fonctionné pour moi jusqu'à ce que j'utilise "afficher les tables complètes où Table_Type = 'BASE TABLE'" au lieu de "AFFICHER LES TABLES"
Brian Peterson

68

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.


pourquoi vous avez ajouté deux requêtes alter table? on ne suffit pas?
Akshay

7
@Akshay, bonne question. La première requête alter-table définit la valeur par défaut pour les nouvelles colonnes et la deuxième requête alter-table convertit les colonnes existantes.
UnlimitedInfinity

4
Pour info : selon dev.mysql.com/doc/refman/5.5/en/alter-table.html la documentation MySQL, la version "CONVERT TO CHARACTER SET" de l'instruction ALTER fait les deux en une seule étape: "Pour changer la table par défaut jeu de caractères et toutes les colonnes de caractères (CHAR, VARCHAR, TEXT) vers un nouveau jeu de caractères ...
devGuy

2
J'ai cette erreur # 1054 - Colonne inconnue 'webdb_playground' dans 'clause clause' mais je suis sûr que ma base de données est la bonne
Yannis Dran

1
@YannisDran Votre nom de base de données n'était peut-être pas dans une chaîne, ce qui WHERE TABLE_SCHEMA=webdb_playgroundvous a donné l'erreur de colonne inconnue, mais WHERE TABLE_SCHEMA="webdb_playground"aurait réussi. Quelque chose à essayer au cas où quelqu'un d'autre se heurterait à cela.
jabbascript

17

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

Étape 1: Modifications au niveau de la base de données

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

Capturez la sortie sql supérieure et exécutez-la. (comme suivre)

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


1
Actuellement, ce script utilise 'utf8_unicode_ci' pour la base de données mais 'utf8_general_ci' pour les tables - était-ce intentionnel? (Je pense que les deux devraient utiliser le même jeu de caractères)
gmcnaughton

stackoverflow.com/questions/10957238/… a laissé une réponse plus complète ici
VH

8

Utilisez HeidiSQL . C'est gratuit et un très bon outil db.

Dans le menu Outils, entrez dans l'éditeur de table en bloc

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

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

Exécuter

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

Fonctionne comme un charme :)

HeidiSQL se connecte par défaut en tant que utf8, donc tout caractère spécial doit maintenant être vu 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 à utf8 est de s'assurer que pdo se connecte avec le 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 partout sur votre page Web, vous faisant penser que les données de la table ne sont pas utf8 ...


Pourriez-vous élaborer, s'il vous plaît? J'ai exactement ce problème - les caractères spéciaux et les espaces apparaissent comme des points d'interrogation. J'essaie de convertir la base de données dans MAMP en utilisant PHPMyAdmin. Ayant développé hors ligne, je découvre maintenant que mon hôte ne prend pas en charge utf8mb4. Je n'ai pas Windows, je ne peux donc pas utiliser HeidiSQL. Existe-t-il un moyen d'y parvenir avec PHPMyAdmin?
RexTheRunt

comme ça. surtout vous avez plein de table.
tyan

J'obtiens et une erreur lorsque j'essaie de convertir le CHARSET: Erreur SQL (1025): Erreur lors du changement de nom ... mais c'est un incroyable outil de gestion SQL!
marcolopes

Si quelqu'un a besoin d'un bon aperçu et d'un didacticiel pour heidisql, consultez cet article .
DougB

6

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

4

Dans le cas où les données ne sont pas dans le même jeu de caractères, vous pouvez envisager cet extrait de http://dev.mysql.com/doc/refman/5.0/en/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, pas 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 pour utiliser un type de données binaire, puis vers 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 obtenir des conflits de clés uniques. Par exemple, Éleanore et Eleanore pourraient être considérées comme les mêmes dans certaines collations.

De côté:

J'ai eu une situation où certains personnages ont "cassé" dans les e-mails, même s'ils étaient stockés en UTF-8 dans la base de données. Si vous envoyez des e-mails à l'aide de données utf8, vous pouvez également convertir vos e-mails pour les envoyer en UTF8.

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


4

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 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>";
}

D'où exécutons-nous ce script?
Yannis Dran

1
@YannisDran Peu importe, tant que l'adresse IP à partir de laquelle vous l'exécutez a accès à la base de données. Assurez-vous de prendre une sauvegarde en premier!
Dan Lucas

Bon, et comment le gérons-nous? Doit-on le télécharger sur le serveur puis exécuter entrer le chemin d'accès à sa position?
Yannis Dran

4
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();

Merci, c'est l'une des rares réponses qui montre comment faire pour l'ensemble de la base de données (c'est-à-dire chaque table). A fonctionné comme un charme.
Machisuji

3
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

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

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

  1. CHAR => BINAIRE
  2. TEXTE => 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 tableaux latin1 et il a gardé tous les 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, 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 tables, faites de même sur la base de données:

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

1

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

create database database_name character set utf8;

0

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

alter table nom_table charset = 'utf8';

Il s'agit d'une requête simple que j'ai pu utiliser pour mon cas, vous pouvez modifier le nom_table selon vos besoins.


Normalement, une réponse doit être accompagnée d'une explication de ce que vous proposez de faire.
RiggsFolly

0

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 à l'invite mysql>. Remplacez DBNAME par le nom de la base de données:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;

0

Vous pouvez également utiliser l'outil DB Navicat, ce qui le rend plus facile.

  • Siva.

Faites un clic droit sur votre base de données et sélectionnez les propriétés de la base de données et modifiez comme vous le souhaitez dans le menu déroulant

entrez la description de l'image ici


0

Solution de ligne de commande et vues d'exclusion

Je complète simplement la réponse de @ Jasny pour d'autres personnes comme @Brianmoi et moi qui avons des vues dans notre base de données.

Si vous avez une erreur comme celle-ci:

ERROR 1347 (HY000) at line 17: 'dbname.table_name' is not of type 'BASE TABLE'

C'est parce que vous avez probablement des vues et que vous devez les exclure. Mais en essayant de les exclure, MySQL renvoie 2 colonnes au lieu de 1.

SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE';
-- table_name1  BASE TABLE
-- table_name2  BASE TABLE

Nous devons donc adapter la commande de Jasny avec awkpour extraire uniquement la 1ère colonne qui contient le nom de la table.

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

Une doublure pour un simple copier / coller

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

-1

Pour changer le codage du jeu de caractères en UTF-8, suivez les étapes simples dans PHPMyAdmin

  1. Sélectionnez votre base de données SS

  2. Aller aux opérations SS

  3. Dans l'onglet opérations, dans le menu déroulant du classement inférieur, sélectionnez le codage souhaité, c'est-à-dire (utf8_general_ci), et cochez également la case (1) modifier tous les classements de table, (2) modifier tous les classements de colonnes de table. et appuyez sur Go.

SS

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.