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?
mysql
character-encoding
doyen
la source
la source
utf8_unicode_ci
, nonutf8_general_ci
.utf8mb4
plutôt queutf8
deutf8
ne 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.utf8mb4
vous devrez également basculer le classement surutf8mb4_unicode_ci
utf8mb4_unicode_520_ci
ou la dernière version disponible.Réponses:
Utilisez les commandes
ALTER DATABASE
etALTER TABLE
.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
utf8
plutôtutf8mb4
:la source
CONVERT TO
technique 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).Faites une sauvegarde!
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.
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.
la source
utf8_general_ci
n'est plus la meilleure pratique recommandée. Depuis MySQL 5.5.3, vous devriez utiliserutf8mb4
plutôt queutf8
. Ils se réfèrent tous deux à l'encodage UTF-8, mais l'ancienutf8
avait une limitation spécifique à MySQL empêchant l'utilisation des caractères numérotés ci-dessus0xFFFD
.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
Une doublure pour un simple copier / coller
la source
ERROR 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"
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" `Vous pouvez créer le sql pour mettre à jour toutes les tables avec:
Capturez la sortie et exécutez-la.
La réponse d'Arnold Daniels ci-dessus est plus élégante.
la source
WHERE TABLE_SCHEMA=webdb_playground
vous a donné l'erreur de colonne inconnue, maisWHERE TABLE_SCHEMA="webdb_playground"
aurait réussi. Quelque chose à essayer au cas où quelqu'un d'autre se heurterait à cela.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
Correction du classement de la base de données
É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
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)
voir: https://confluence.atlassian.com/display/CONFKB/How+to+Fix+the+Collation+and+Character+Set+of+a+MySQL+Database
la source
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,
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 ...
la source
Inspiré par le commentaire @sdfor, voici un script bash qui fait le travail
la source
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
Voici un exemple:
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';
la source
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:
la source
la source
la source
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:
Par exemple.:
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:
Après avoir fait cela sur toutes vos colonnes, vous le faites sur toutes les tables:
Pour générer cette requête pour toute votre table, utilisez la requête suivante:
Et maintenant que vous avez modifié toutes vos colonnes et tables, faites de même sur la base de données:
la source
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:
la source
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
la source
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.
la source
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:
la source
Vous pouvez également utiliser l'outil DB Navicat, ce qui le rend plus facile.
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
la source
Solution de ligne de commande et vues d'exclusion
Je complète simplement la réponse de @ Jasny pour d'autres personnes comme
@Brian
moi et moi qui avons des vues dans notre base de données.Si vous avez une erreur comme celle-ci:
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.
Nous devons donc adapter la commande de Jasny avec
awk
pour extraire uniquement la 1ère colonne qui contient le nom de la table.Une doublure pour un simple copier / coller
la source
Pour changer le codage du jeu de caractères en UTF-8, suivez les étapes simples dans PHPMyAdmin
Sélectionnez votre base de données
Aller aux opérations
la source