Obtener la codificación correcta es realmente complicado: hay demasiadas capas:
- Navegador
- Página
- PHP
- MySQL
El comando SQL "SET CHARSET utf8" de PHP asegurará que el lado del cliente (PHP) obtendrá los datos en utf8, sin importar cómo estén almacenados en la base de datos. Por supuesto, primero deben almacenarse correctamente.
Definición de DDL frente a datos reales
La codificación definida para una tabla / columna no significa realmente que los datos estén en esa codificación. Si tiene una tabla definida como utf8
pero almacenada con una codificación diferente, entonces MySQL las tratará como utf8
si estuviera en problemas. Lo que significa que tienes que arreglar esto primero.
Que comprobar
Debe verificar qué codifica el flujo de datos en cada capa.
- Compruebe los encabezados HTTP, encabezados.
- Verifique lo que realmente se envió en el cuerpo de la solicitud.
- No olvide que MySQL tiene codificación en casi todas partes:
- Base de datos
- Mesas
- Columnas
- Servidor en su conjunto
- Cliente
Asegúrese de que haya el correcto en todas partes.
Conversión
Si recibe datos en windows-1250
, por ejemplo , y desea almacenarlos utf-8
, utilice este SQL antes de almacenar:
SET NAMES 'cp1250';
Si tiene datos en la base de datos windows-1250
y desea recuperarlos utf8
, use:
SET CHARSET 'utf8';
Algunas notas más:
- No confíe en herramientas demasiado "inteligentes" para mostrar los datos. Por ejemplo, phpMyAdmin hace (estaba haciendo cuando lo estaba usando) codificación realmente mala. Y pasa por todas las capas, por lo que es difícil de averiguar.
- Además, Internet Explorer tuvo un comportamiento realmente estúpido al "adivinar" la codificación basándose en reglas extrañas.
- Utilice editores sencillos en los que pueda cambiar la codificación. Recomiendo MySQL Workbench.