J'ai essayé d'utiliser UTF-8 et j'ai eu des ennuis.
J'ai essayé beaucoup de choses. voici les résultats que j'ai obtenus:
????
au lieu de caractères asiatiques. Même pour le texte européen, j'ai Se?or
pour Señor
.Señor
ou 新浪新闻
pour 新浪新闻
.Se
pour Señor
.Qu'est-ce que je fais mal? Comment puis-je réparer le code? Puis-je récupérer le data, si oui, comment?
Ce problème affecte les participants de ce site et de nombreux autres.
Vous avez énuméré les cinq principaux cas de CHARACTER SET
problèmes.
Meilleure pratique
À l'avenir, il est préférable d'utiliser CHARACTER SET utf8mb4
et COLLATION utf8mb4_unicode_520_ci
. (Il existe une version plus récente du classement Unicode dans le pipeline.)
utf8mb4
est un sur-ensemble de utf8
dans la mesure où il gère les codes utf8 sur 4 octets, nécessaires à Emoji et à certains chinois.
En dehors de MySQL, "UTF-8" fait référence à tous les codages de taille, donc identiques à ceux de MySQL utf8mb4
, ne pas utf8
.
J'essaierai d'utiliser ces orthographes et majuscules pour distinguer intérieurement et extérieurement de MySQL dans la suite.
Aperçu de ce que vous devriez faire
<form accept-charset="UTF-8">
.CHARACTER SET utf8mb4
(Vérifier avec SHOW CREATE TABLE
.)<meta charset=UTF-8>
au début de HTMLPlus de détails pour les langages informatiques (et ses sections suivantes)
Testez les données
L'affichage des données avec un outil ou avec SELECT
ne peut pas être approuvé. Trop de ces clients, en particulier les navigateurs, tentent de compenser les encodages incorrects et vous montrent le texte correct même si la base de données est endommagée. Alors, choisissez un tableau et une colonne qui a un texte non anglais et faites
SELECT col, HEX(col) FROM tbl WHERE ...
Le HEX pour UTF-8 correctement stocké sera
20
4x
, 5x
, 6x
, ou 7x
Cxyy
Dxyy
Exyyzz
F0yyzzww
Causes spécifiques et solutions des problèmes rencontrés
Tronqué texte (Se
pour Señor
):
Black Diamonds avec des points d'interrogation (Se�or
pour Señor
); l'un de ces cas existe:
Cas 1 (les octets d'origine étaient pas UTF-8):
SET NAMES
) pour le INSERT
et le SELECT
n'était pas utf8/utf8mb4. Répare ça.CHARACTER SET utf8
(ou utf8mb4).Cas 2 (octets d'origine étaient UTF-8):
SET NAMES
) pour le SELECT
n'était pas utf8/utf8mb4. Répare ça.CHARACTER SET utf8
(ou utf8mb4).Les diamants noirs apparaissent uniquement lorsque le navigateur est défini sur <meta charset=UTF-8>
.
Points d'interrogation (normaux, pas de diamants noirs) (Se?or
pour Señor
):
CHARACTER SET utf8
(ou utf8mb4). Répare ça. (Utilisation SHOW CREATE TABLE
.) Mojibake (Señor
pour Señor
): (Cette discussion s'applique également à le double codage , qui n'est pas nécessairement visible.)
INSERTing
et SELECTing
text doit spécifier utf8 ou utf8mb4. Répare ça.CHARACTER SET utf8
(ou utf8mb4). Répare ça.<meta charset=UTF-8>
.Si les données semblent correctes, mais ne trient pas correctement, soit vous avez sélectionné le mauvais classement, soit aucun classement ne correspond à votre besoin, ou vous avez un double codage .
Le double encodage peut être confirmé en faisant le SELECT .. HEX ..
décrit ci-dessus.
é should come back C3A9, but instead shows C383C2A9
The Emoji ???? should come back F09F91BD, but comes back C3B0C5B8E28098C2BD
Autrement dit, l'hex est environ deux fois plus long qu'il devrait l'être. Cela est dû à la conversion de latin1 (ou quoi que ce soit) en utf8, puis à traiter ces octets comme s’ils étaient en latin1 et à répéter la conversion. Le tri (et la comparaison) ne fonctionnent pas correctement car il s’agit, par exemple, d’un tri comme si la chaîne était Señor
.
Correction des données, si possible
Pour Troncature et Points d'interrogation , les données sont perdues.
Pour Mojibake / Double Encodage , ...
Pour Black Diamonds , ...
(Je vais devoir continuer dans une autre question/réponse.)
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 tombé sur celle-ci:
mysqli_set_charset($con,"utf8");
Après avoir ajouté cette ligne à mon fichier de configuration, tout fonctionne correctement!
J'ai trouvé cette solution pour mysqli https://www.w3schools.com/PHP/func_mysqli_set_charset.asp quand je cherchais à résoudre une requête d'insertion à partir de html
bonne chance!
C'est drôle comment tu réponds à ta propre question :)
Définissez votre code IDE langue sur UTF8
Ajoutez à l'en-tête de votre page Web où vous collectez le formulaire de données.
Vérifiez que votre définition de table MySQL ressemble à ceci:
CREATE TABLE your_table (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Si vous utilisez PDO, assurez-vous
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES utf8');
$dbL = new PDO($pdo, $user, $pass, $options);
Si vous avez déjà une grosse base de données avec le problème ci-dessus, vous pouvez essayer d'exporter SIDU avec le jeu de caractères correct et de l'importer avec UTF8. Bonne chance