Pregunta

Mis guiones definitivamente se guardan en UTF-8. Estoy instanciando PDO con "{$this->engine}:host={$this->host};dbname={$this->name};charset=UTF-8". Mis tablas usan innodb y se recopilan usando UTF8_General_CI. Mis páginas se envían con el Content-Type: text/html; charset=UTF-8 encabezado o el <meta> equivalente.

Cuando se usa PDO para almacenar un carácter € que se origina desde la entrada HTTP o de una cadena literal en el código fuente, me queda c3 a2 e2 80 9a c2 ac Según MySQL Workbench 5.2. Recuperar esto de la base de datos y mostrarlo en la página funciona bien. Sin embargo, en Phpmyadmin y Workbench, veo €.

Al usar estas dos herramientas para almacenar un €, me queda e2 82 ac, que aparentemente es la representación correcta de UTF-8, pero si intento recuperar y luego lo saco con PHP, se muestra.

Mi pregunta es, ¿desde dónde surge esta discrepancia y es posible que mis páginas web y mis herramientas de base de datos funcionen sin problemas?

¿Fue útil?

Solución

La directiva Charset en el DSN en realidad se aplica a MSSQL. Simplemente necesitaba ejecutar SET NAMES. Lo lamento.

Lo logré así:

parent::__construct("{$this->engine}:host={$this->host};dbname={$this->name}",
                    $this->user, $this->password,
                    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"));

Otros consejos

Simplemente, convierta € a una entidad HTML € para el superfix (pero puede obtener el problema con otros caracteres especiales)

El otro lado del problema (y más específicamente) es verificar el mysql caracteres_set_server y la causa más común caracteres_set_client - ver también: charsets de conexión

Además, es importante tener en cuenta que el meta equiv no hace ninguna diferencia, necesitas que siempre Establezca el encabezado ('Content-Type: ...)

Dado que su página HTML es correcta, parece que está almacenando los datos correctos en la base de datos.

€ es la codificación UTF-8 del signo del euro malinterpretado como Windows-1252. Parece que sus herramientas de Windows utilizan la codificación "ANSI" en lugar de la codificación de la base de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top