L'une des réponses à une question que j'ai posée hier m'a suggéré de m'assurer que ma base de données peut gérer correctement les caractères UTF-8. Comment puis-je faire cela avec MySQL?
102
L'une des réponses à une question que j'ai posée hier m'a suggéré de m'assurer que ma base de données peut gérer correctement les caractères UTF-8. Comment puis-je faire cela avec MySQL?
CHARACTER SETs
; 5.1.24 a gâché la collation de l'allemand sharp-s (ß), qui a été corrigée en ajoutant une autre collation dans 5.1.62 (sans doute aggravant les choses); 5.5.3 a rempli utf8 avec le nouveau jeu de caractères utf8mb4.utf8
. Il ne prend en charge que les caractères jusqu'à 3 octets. Le jeu de caractères correct que vous devez utiliser dans MySQL estutf8mb4
.Réponses:
Mettre à jour:
Réponse courte - Vous devriez presque toujours utiliser le
utf8mb4
jeu de caractères et lautf8mb4_unicode_ci
collation.Pour modifier la base de données:
Voir:
Commentaire d'Aaron sur cette réponse Comment faire en sorte que MySQL gère correctement UTF-8
Quelle est la différence entre utf8_general_ci et utf8_unicode_ci
Guide de conversion: https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-conversion.html
Réponse originale:
MySQL 4.1 et supérieur a un jeu de caractères par défaut de UTF-8. Vous pouvez vérifier cela dans votre
my.cnf
fichier, n'oubliez pas de définir à la fois client et serveur (default-character-set
etcharacter-set-server
).Si vous avez des données existantes que vous souhaitez convertir en UTF-8, videz votre base de données et réimportez-la au format UTF-8 en vous assurant:
SET NAMES utf8
avant d'interroger / insérer dans la base de donnéesDEFAULT CHARSET=utf8
lors de la création de nouvelles tablesmy.cnf
). rappelez-vous que toutes les langues que vous utilisez (comme PHP) doivent également être UTF-8. Certaines versions de PHP utiliseront leur propre bibliothèque client MySQL, qui peut ne pas être compatible UTF-8.Si vous souhaitez migrer les données existantes, n'oubliez pas de sauvegarder d'abord! Beaucoup de découpages étranges de données peuvent se produire lorsque les choses ne se passent pas comme prévu!
Quelques ressources:
la source
utf8
dans MySQL ne fait référence qu'à un petit sous-ensemble d'Unicode complet. Vous devriez utiliser à lautf8mb4
place pour forcer le support complet. Voir mathiasbynens.be/notes/mysql-utf8mb4 "Pendant longtemps, j'utilisais le jeu de caractères utf8 de MySQL pour les bases de données, les tables et les colonnes, en supposant qu'il était mappé au codage UTF-8 décrit ci-dessus."latin1
etlatin1_swedish_ci
pour le jeu de caractères et le classement par défaut. Consultez la page "Jeu de caractères du serveur et classement" dans le manuel MySQL pour confirmation: dev.mysql.com/doc/refman/5.1/en/charset-server.htmlutf8mb4
de la capacité de stockage supplémentaire lorsque la plupart du texte est ASCII. Bien que leschar
chaînes soient préallouées, lesvarchar
chaînes ne le sont pas - voir les dernières lignes de cette page de documentation . Par exemple,char(10)
sera réservé de manière pessimiste 40 octets sous utf8mb4, maisvarchar(10)
allouera des octets conformément au codage de longueur variable.varchar(n)
dutext
type de données si vous essayez de modifier unvarchar(n)
champ plus grand que la taille d'octets possible (tout en émettant un avertissement). Un index aura également une limite supérieure inférieure dans le pire des cas, ce qui peut présenter d'autres problèmes.Pour rendre cela `` permanent '', en
my.cnf
:Pour vérifier, accédez au client et affichez quelques variables:
Vérifiez qu'ils sont tous
utf8
, sauf..._filesystem
, qui devrait êtrebinary
et..._dir
, qui pointe quelque part dans l'installation de MySQL.la source
create table my_name(field_name varchar(25) character set utf8);
utf8
n'est pas UTF-8 "complet".MySQL 4.1 et supérieur a un jeu de caractères par défaut qu'il appelle
utf8
mais qui n'est en fait qu'un sous-ensemble d'UTF-8 (n'autorise que des caractères de trois octets et plus petits).Utilisez-le
utf8mb4
comme jeu de caractères si vous voulez un UTF-8 "complet".la source
utf8
n'inclut pas les caractères comme les émoticônes.utf8mb4
Est-ce que. Vérifiez ceci pour plus d'informations sur la mise à jour: mathiasbynens.be/notes/mysql-utf8mb4La réponse courte: à utiliser
utf8mb4
à 4 endroits:SET NAMES utf8mb4
ou quelque chose d'équivalent lors de l'établissement de la connexion du client à MySQLCHARACTER SET utf8mb4
sur toutes les tables / colonnes - à l'exception des colonnes qui sont strictement ascii / hex / country_code / zip_code / etc.<meta charset charset=UTF-8>
si vous sortez au format HTML. (Oui, l'orthographe est différente ici.)Plus d'infos ;
UTF8 jusqu'au bout
Les liens ci-dessus fournissent la "réponse canonique détaillée est nécessaire pour répondre à toutes les préoccupations". - Il y a une limite d'espace sur ce forum.
Éditer
En plus de
CHARACTER SET utf8mb4
contenir «tous» les personnages du monde,COLLATION utf8mb4_unicode_520_ci
on peut soutenir la meilleure collation «tout autour» à utiliser. (Il existe également des classements turc, espagnol, etc. pour ceux qui veulent les nuances dans ces langues.)la source
Le jeu de caractères est une propriété de la base de données (par défaut) et de la table. Vous pouvez jeter un œil (commandes MySQL):
En d'autres termes; il est assez facile de vérifier le jeu de caractères de votre base de données ou de le modifier:
la source
utf8
n'est pas UTF-8 "complet".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>. UTILISATION
ALTER DATABASE
.. Remplacez DBNAME par le nom de la base de données:Ceci est un double de cette question Comment convertir un jeu de caractères et un classement de base de données MySQL en UTF-8?
la source
J'ai suivi la solution de Javier, mais j'ai ajouté quelques lignes différentes dans my.cnf:
J'ai trouvé cette idée ici: http://dev.mysql.com/doc/refman/5.0/en/charset-server.html dans le premier / seul commentaire utilisateur en bas de page. Il mentionne que skip-character-set-client-handshake a une certaine importance.
la source
skip-character-set-client-handshake
était la clé.Ces conseils sur MySQL et UTF-8 peuvent être utiles. Malheureusement, ils ne constituent pas une solution complète, juste des pièges courants.
la source
Définissez votre
database collation
pourUTF-8
puis appliquertable collation
à la base de données par défaut.la source
Votre réponse est que vous pouvez configurer par MySql Settings. Dans ma réponse, il se peut que ce soit quelque chose qui sort de son contexte, mais c'est aussi une aide pour vous.
comment configurer
Character Set
etCollation
.utf8
, tandis que les applications qui utilisent une autre base de données peuvent nécessiter sjis.Les exemples montrés ici pour votre question pour définir le jeu de caractères utf8, ici également définir le classement pour plus utile (
utf8_general_ci
collation`).Spécifiez les paramètres de caractère par base de données
Spécifier les paramètres de caractère au démarrage du serveur
Spécifiez les paramètres de caractères au moment de la configuration de MySQL
Pour afficher les valeurs du jeu de caractères et des variables système de classement qui s'appliquent à votre connexion, utilisez ces instructions:
Cela peut être une longue réponse, mais il y a tous les moyens, vous pouvez utiliser. J'espère que ma réponse vous sera utile. pour plus d'informations http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html
la source
SET NAMES UTF8
Cela fait l'affaire
la source
SET NAMES UTF8
(ouUTF8mb4
) est correcte, vous n'expliquez pas ce qu'il fait (jeu de caractères utilisé pour cette connexion). "Cela fait l'affaire" semble résoudre le problème (faire en sorte que MySQL gère correctement UTF-8), mais de nombreuses bases de données MySQL sont réglées sur latin1 par défaut, donc cela ne ferait pas une bonne solution. Je changerais le jeu de caractères par défaut et les jeux de caractères de table en utf8mb4. Vraiment, cette réponse est plutôt incomplète, alors je l'ai déclinée.CONNEXION DE LA BASE DE DONNÉES À L'UTF-8
la source
Définissez votre connexion à la base de données sur UTF8:
la source
mysql_*
interface obsolète . Basculez versmysqli_*
ouPDO
.A pu trouver une solution. Ran the following comme spécifié à http://technoguider.com/2015/05/utf8-set-up-in-mysql/
la source
CHARACTER SET utf8
.root
n'exécutera pas le plus importantinit_connect
.