Que s'est-il passé :
- vous aviez des données encodées en utf8 (bien)
SET NAMES latin1
était en vigueur (par défaut, mais erroné)- la colonne a été déclarée
CHARACTER SET latin1
(par défaut, mais faux)
Comme vous l'avez INSERTed
les données, elles ont été converties en latin1, qui n'a pas de valeurs pour les caractères arabes (kurde/farsi/etc), donc les points d'interrogation les ont remplacés.
Le remède (pour les futurs INSERTs
):
- Données encodées en utf8 (bonnes)
mysqli_set_charset('utf8')
(ou tout ce dont votre client a besoin pour établir leCHARACTER SET
)- vérifier que la ou les colonnes et/ou la table par défaut sont
CHARACTER SET utf8
- Si vous affichez sur une page Web,
<meta...utf8>
devrait être près du sommet.
La discussion ci-dessus concerne CHARACTER SET
, l'encodage des caractères. Maintenant, un conseil sur COLLATION
, qui est utilisé pour comparer et trier.
Pour vérifier que les données sont stockées correctement, faites SELECT col, HEX(col)...
.هرچوون
devrait revenir D987E2808CD8B1DA86D988D988D986
Les caractères arabes en utf8 ont l'hexagone de D8xx ou D9xx.
(utf8mb4
fonctionne aussi bien que utf8
; l'un ou l'autre fonctionne pour l'arabe.)
Mauvaise nouvelle :les données qui ont été insérées et transformées en '???' ne peut pas être récupéré.