Tu problema es que tu SET NAMES 'utf8_persian_ci'
el comando era inválido (utf8_persion_ci es una colección , no una codificación ). Si lo ejecuta en una terminal, verá un error Unknown character set: 'utf8_persian_ci'
. Por lo tanto, su aplicación, cuando almacenó los datos, estaba usando el latin1
conjunto de caracteres. MySQL interpretó su entrada como caracteres latin1 que luego almacenó codificados como utf-8. Del mismo modo, cuando se extrajeron los datos, MySQL los convirtió de UTF-8 a latin1 y (con suerte, la mayoría de las veces) a los bytes originales que le diste.
En otras palabras, todos sus datos en la base de datos están completamente desordenados, pero resultó que funcionó.
Para arreglar esto, necesitas deshacer lo que hiciste. La forma más sencilla es usar PHP:
SET NAMES latin1;
- Seleccione cada campo de texto de cada tabla.
SET NAMES utf8;
- Actualice las mismas filas usando la misma cadena sin modificar.
Alternativamente, puede realizar estos pasos dentro de MySQL, pero es complicado porque MySQL entiende que los datos están en un determinado conjunto de caracteres. Debe modificar sus columnas de texto a un tipo BLOB, luego modificarlas atrás a tipos de texto con un juego de caracteres utf8. Consulte la sección en la parte inferior de ALTER TABLE
Documentación de MySQL etiquetada como "Advertencia" en rojo
.
Después de hacer una de estas cosas, los bytes almacenados en las columnas de su base de datos serán el conjunto de caracteres real que afirman ser. Luego, asegúrese de usar siempre mysql_set_charset('utf8')
en cualquier acceso a la base de datos desde PHP que pueda hacer en el futuro! De lo contrario, volverás a estropear las cosas. (Nota:no utilice un mysql_query('SET NAMES utf8')
simple ! Hay casos de esquina (como una conexión de reinicio) donde esto se puede restablecer a latin1
sin tu conocimiento mysql_set_charset()
establecerá el juego de caracteres siempre que sea necesario).
Sería mejor si cambiaras de mysql_*
funciones y PDO
usado en su lugar con el charset=utf8
parámetro en su PDO dsn
.