Problèmes avec les caractères UTF-8; ce que je vois n'est pas ce que j'ai stocké
J'ai essayé d'utiliser l'UTF-8 et a couru dans le mal.
J'ai essayé beaucoup de choses; voici les résultats que j'ai obtenu:
????
au lieu de caractères Asiatiques. Même pour le texte Européen, j'ai euSe?or
pourSeñor
.- Étrange charabia (Mojibake?) comme
Señor
ou新浪新闻
pour新浪新闻
. - Diamants noirs, comme Se�ou.
- Enfin, je suis dans une situation où les données ont été perdues, ou au moins tronqué:
Se
pourSeñor
. - Même quand j'ai reçu le texte de look droit, il n' sorte correctement.
Ce que je fais mal? Comment puis-je corriger les code? Puis-je récupérer le données, si oui, comment?
Vous devez vous connecter pour publier un commentaire.
Ce problème affecte les participants de ce site, et beaucoup d'autres.
Vous avez la liste des cinq principaux cas de
CHARACTER SET
ennuis.Meilleures Pratiques
Aller de l'avant, il est préférable d'utiliser
CHARACTER SET utf8mb4
etCOLLATION utf8mb4_unicode_520_ci
. (Il existe une version plus récente de l'Unicode collation dans le pipeline.)utf8mb4
est un sur-ensemble deutf8
en ce qu'il traite de 4 octets en utf-8 codes, qui sont nécessaires par Emoji et certains de Chinois.À l'extérieur de MySQL, "UTF-8" se réfère à tous les formats de codage, donc effectivement la même chose que MySQL
utf8mb4
, pasutf8
.Je vais essayer d'utiliser ceux de l'orthographe et de la capitalisation boursière de distinguer à l'intérieur par rapport à l'extérieur de MySQL dans la suite.
Aperçu de ce que vous devrait ne
<form accept-charset="UTF-8">
.CHARACTER SET utf8mb4
(Vérifier avecSHOW CREATE TABLE
.)<meta charset=UTF-8>
au début de HTMLUTF-8 tout le chemin à travers
Plus de détails pour les langages informatiques (et de ses sections suivantes)
De Test les données
La visualisation des données avec un outil ou avec
SELECT
ne peut pas faire confiance.Trop de clients, en particulier les navigateurs, essayez de compenser d'une erreur de codage, et de vous montrer le texte correct, même si la base de données est mutilé.
Donc, choisir une table et de colonne qui a une certaine non-texte en anglais et ne
L'hexagone pour correctement stockés UTF-8 sera
20
4x
,5x
,6x
, ou7x
Cxyy
Dxyy
Exyyzz
F0yyzzww
Des causes spécifiques et résout des problèmes
Tronquée texte (
Se
pourSeñor
):Diamants noirs avec des points d'interrogation (
Se�or
pourSeñor
);l'un de ces cas existent:
Cas 1 (original octets ont été pas UTF-8):
SET NAMES
) pour laINSERT
et laSELECT
n'était pas utf8/utf8mb4. Résoudre ce problème.CHARACTER SET utf8
(ou utf8mb4).Cas 2 (original octets ont été UTF-8):
SET NAMES
) pour laSELECT
n'était pas utf8/utf8mb4. Résoudre ce problème.CHARACTER SET utf8
(ou utf8mb4).Diamants noirs ne se produisent que lorsque le navigateur est configuré pour
<meta charset=UTF-8>
.Points d'interrogation (réguliers, pas de diamants noirs) (
Se?or
pourSeñor
):CHARACTER SET utf8
(ou utf8mb4). Résoudre ce problème. (UtiliserSHOW CREATE TABLE
.)Mojibake (
Señor
pourSeñor
):(Cette discussion s'applique également à Double Codage, ce qui n'est pas nécessairement visible.)
INSERTing
etSELECTing
texte doit spécifier utf8 ou utf8mb4. Résoudre ce problème.CHARACTER SET utf8
(ou utf8mb4). Résoudre ce problème.<meta charset=UTF-8>
.Si les données semble correct, mais ne pas trier correctement, alors
soit vous avez choisi le mauvais classement,
ou il n'y a pas de classement qui convient à votre besoin,
ou vous avez Double Codage.
Double Codage peut être confirmé par la pratique de la
SELECT .. HEX ..
décrit ci-dessus.Qui est, l'hexagone est environ deux fois plus longtemps qu'il devrait être.
Ceci est causé par la conversion de latin1 (ou autre) pour de l'utf-8, puis le traitement de ces
octets comme si elles étaient en latin1 et en répétant la conversion.
Le tri (et comparer) ne fonctionne pas correctement car il est, par exemple,
le tri si la chaîne ont été
Señor
.Fixation de Données, si possible
Pour Troncature et points d'interrogation, les données sont perdues.
Pour Mojibake /Double Codage, ...
Pour Diamants Noirs, ...
(Je vais devoir continuer ce, dans une autre question/réponse.)
utf8mb4
je semble être en mesure de stocker des émoticônes amende. Certains blogs suggèrent également la mise encollation-server
etcharacter-set-server
de mysqld. Ai-je vraiment besoin de changermysqld
quelle est la différence de paramètre de serveur faire?SET NAMES utf8mb4
juste après la connexion. Après tout, c'est de déclarer l'encodage dans le client.utf8mb4
etutf8mb4_0900_ai_ci
. La plupart des utilisateurs devraient utiliser sans considérer les autres jeux de caractères et collations.FUNCTION
ouSTORED PROCEDURE
, vous pouvez n'ont pas été en utilisant le jeu de caractères voulu quand vous l'avez créé.DROP
il,SET NAMES
; re-CREATE
il.J'ai eu des problèmes similaires avec 2 de mes projets, après une migration de serveur. Après avoir cherché et essayé beaucoup de solutions, je suis venu à travers avec celui-ci:
Après l'ajout de cette ligne de mon fichier de config tout fonctionne bien!
J'ai trouvé cette solution pour mysqli https://www.w3schools.com/PHP/func_mysqli_set_charset.asp quand j'étais à la recherche à résoudre une insertion provenant de l'editeur de requête html
bonne chance!
mysqli
, pasPDO
.Drôle de voir comment vous répondre à votre propre question 🙂
Définir votre code IDE langue à l'UTF8
Ajouter à votre page web, en-tête où vous collectez des données de formulaire.
Vérifier votre table MySQL définition ressemble à ceci:
Si vous utilisez PDO, assurez-vous que
Si vous avez déjà obtenu une grande base de données avec le problème ci-dessus, vous pouvez essayer de SIDU à l'exportation avec le bon charset, et de les importer avec l'UTF8. Bonne chance
DEFAULT CHARSET
pour une table est juste que, un par défaut. Il peut, et parfois doit, être remplacé sur la définition de la colonne.$db = new PDO('dblib:host=host;dbname=db;charset=UTF8', $user, $pwd);
(Ceci est indiqué dans le lien de mon "charcoll' document.)CHAR(n)
. (Ce qui a mordu à certaines personnes qui n'ont pas l'avis de l'ensemble du système par défaut de changer pour de l'utf-8.)ALTER DATABASE
déclaration ne nécessite pas un redémarrage de MySQL pour prendre effet. Toutefois, la modification de la valeur par défaut characterset pour une base de données n' pas incidence sur les tableaux actuellement dans la base de données; il n'a d'effet que sur de nouvelles tables par exempleCREATE TABLE
qui ne spécifiez pas un défaut characterset pour la table; c'est lorsque la base de données par défaut characterset entre en jeu. (De même, modifier la valeur par défaut characterset de la table n'a pas d'incidence sur les colonnes déjà dans la table; il a uniquement un effet sur les colonnes ajoutées à la table, quand aucune colonne characterset est spécifié.ALTER
, comme expliqué ici: mysql.rjweb.org/doc.php/charcoll#fixes_for_various_casesEn fonction de la façon dont le serveur est configuré, vous devez changer l'encodage en conséquence. utf8 à partir de ce que vous dites doit fonctionner de la meilleure toutefois, si votre obtenir des caractères bizarres, il pourrait aider si vous modifiez la page web
Encoder en Ansi.
Cela m'a aidé quand j'ai été la mise en place d'un PHP MYSQLI cela peut vous aider à comprendre plus https://superuser.com/questions/762473/ansi-to-utf-8-in-notepad
ANSI
est probablement le plus proche de MySQLlatin1
. Le 0x93 dans ce lien est“
et probablement venu de quelque part comme Word. Vous pouvez soit convertir en utf8 (hexE2809C
) ou de dire à MySQL que les données sontlatin1
et j'espère que vous n'avez pas le voyage jusqu'à quelque part d'autre.