Qué pasó:
- tenías datos codificados en utf8 (bueno)
SET NAMES latin1estaba en vigor (predeterminado, pero incorrecto)- la columna fue declarada
CHARACTER SET latin1(predeterminado, pero incorrecto)
Mientras INSERTed los datos, se convirtió a latin1, que no tiene valores para los caracteres árabes (kurdo/farsi/etc), por lo que los signos de interrogación los reemplazaron.
La cura (para futuros INSERTs) ):
- datos codificados en utf8 (bueno)
mysqli_set_charset('utf8')(o lo que su cliente necesite para establecer elCHARACTER SET)- verifique que la(s) columna(s) y/o la tabla por defecto sean
CHARACTER SET utf8 - Si está visualizando en una página web,
<meta...utf8>debe estar cerca de la parte superior.
La discusión anterior es sobre CHARACTER SET , la codificación de caracteres. Ahora un consejo sobre COLLATION , que se utiliza para comparar y clasificar.
Para comprobar que los datos se almacenan correctamente, SELECT col, HEX(col)... .هرچوون debería volver D987E2808CD8B1DA86D988D988D986
Los caracteres árabes en utf8 tienen el hexadecimal D8xx o D9xx.
(utf8mb4 funciona tan bien como utf8; cualquiera funciona para árabe.)
Malas noticias:Los datos que se insertaron y se convirtieron en '???' no se puede recuperar.