sql >> Base de Datos >  >> RDS >> Mysql

Para usar utf8 o no:problema de codificación de caracteres MySQL y PHP

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:

  1. SET NAMES latin1;
  2. Seleccione cada campo de texto de cada tabla.
  3. SET NAMES utf8;
  4. 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 .