Caracteres Utf-8 mostrados como ISO-8859-1

Tengo un problema con la inserción / lectura de contenido utf8 desde un db. Todas las verificaciones que estoy haciendo parecen apuntar al hecho de que el contenido en mi base de datos debe ser codificado para utf8, sin embargo, parece estar codificado en latín. Los datos se importan inicialmente desde un script PHP desde la CLI.

Configuración:

Zend Framework Version: 1.10.5 mysql-server-5.0: 5.0.51a-3ubuntu5.7 php5-mysql: 5.2.4-2ubuntu5.10 apache2: 2.2.8-1ubuntu0.16 libapache2-mod-php5: 5.2.4-2ubuntu5.10 

Vertificaciones:

-mysql:

 mysql> SHOW VARIABLES LIKE 'character_set%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec) mysql> SHOW VARIABLES LIKE 'collation%'; +----------------------+-----------------+ | Variable_name | Value | +----------------------+-----------------+ | collation_connection | utf8_general_ci | | collation_database | utf8_bin | | collation_server | utf8_general_ci | +----------------------+-----------------+ 

-base de datos

 created with CREATE DATABASE mydb CHARACTER SET utf8 COLLATE utf8_bin; CREATE SCHEMA `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin ; mysql> status; -------------- mysql Ver 14.12 Distrib 5.0.51a, for debian-linux-gnu (i486) using readline 5.2 Connection id: 7 Current database: mydb Current user: root@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 5.0.51a-3ubuntu5.7-log (Ubuntu) Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: utf8 Db characterset: utf8 Client characterset: utf8 Conn. characterset: utf8 UNIX socket: /var/run/mysqld/mysqld.sock Uptime: 9 min 45 sec 

-sql: antes de hacer mis inserciones, ejecuto el

 SET names 'utf8'; 

-php: antes de hacer mis insertos utilizo utf8_encode () y mb_detect_encoding () que me da ‘UTF-8’. Después de recuperar el contenido de db y antes de enviarlo al usuario mb_detect_encoding () también da ‘UTF-8’

Prueba de validación:

la única forma de que el contenido se muestre correctamente es establecer el tipo de contenido en latín (si oigo el tráfico, puedo ver el encabezado de tipo de contenido con ISO-8859-1):

 ini_set('default_charset', 'ISO-8859-1'); 

Esta prueba muestra que el contenido sale como latino. No entiendo por qué. ¿Alguien tiene alguna idea?

Gracias.

Bueno, he descubierto que SET NAMES no es tan genial. Haga un pico en los documentos …

Lo que normalmente hago es ejecutar 4 consultas:

 SET CHARACTER SET 'UTF8'; SET character_set_database = 'UTF8'; SET character_set_connection = 'UTF8'; SET character_set_server = 'UTF8'; 

Dale una oportunidad y mira si eso lo hace por ti …

Ah, y recuerde, todos los caracteres UTF-8 < = 127 también son válidos como caracteres ISO-8859-1. Entonces, si solo tiene caracteres <= 127 en la secuencia, mb_detect_encoding caerá en el conjunto de caracteres de prevalencia más alto (que es por defecto “UTF-8”) …

  1. ¿Qué estás haciendo antes de la recuperación ? También un ‘SET NAMES utf8;’? De lo contrario, MySQL convertirá silenciosamente al conjunto de caracteres que la conexión indica como se usa.
  2. Si ni siquiera eso, ¿qué significa una SHOW FULL COLUMNS FROM table; ¿espectáculo? Tener una tabla con un juego de caracteres predeterminado no significa que la columna sea. es decir, esto es válido:

.

 CREATE TABLE test ( `name` varchar(10) character set latin1 ) CHARSET=utf8