2012-10-05 64 views
6

Estoy analizando algunos datos usando PHP y poniéndolo en MySQL. Pero si los datos contienen caracteres especiales como êm-Khê MySQL es la salida de error siguiente:Cómo analizar caracteres especiales con PHP en MySQL?

SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xEAm-Kh\xEA...' 

Después i prueba, MySQL no es el problema. (La intercalación de tablas y columnas es utf8_general_ci) Cuando INSERTO las cadenas êm-Khê en la tabla DIRECTAMENTE (manualmente), entra en ellas. Entonces MySQL puede aceptar esa información.

¿Alguna idea de por qué está teniendo este error en el nivel de PHP?

No entiendo y tengo sobre la codificación de conocimiento muy bien.

  • ¿Por qué es ê transformado en \xEA en la búsqueda?

Así que cuando llegue a los datos como ê, ¿cómo puedo poner en la base de datos, ya que es ê sin cambios?

+1

Puede publicar el código que está haciendo la inserción de DB –

+1

[Manejo de Unicode de adelante hacia atrás en una aplicación web] (http://kunststube.net/frontback/). – DCoder

Respuesta

3

Así que el problema es que su conexión db no es UTF8 sino probablemente LATIN1, por lo que debe usar la función PHP utf8_encode() o ejecutar SET NAMES utf8 después de conectarse a la base de datos.

$handle = new PDO("mysql:host=localhost;dbname=dbname", 
'username', 'password', 
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 

This thread tiene algunas buenas referencias y explicaciones

+0

PDO? Lo siento, no entiendo a qué te refieres. Estoy usando 'mysql_connect'. No es así. –

+1

Oh, OK, lo obtuve usando el método php 'utf8_encode()'. Gracias x) –

+0

Es bueno mencionar que después de 5.3.6 debe usar '; charset = utf8' como parte de la cadena de conexión. –

0

Supongo que hay una falta de correspondencia de codificación entre PHP y MySQL. ê no está realmente "transformado" en \xEA, es solo que MySQL no sabe lo que se supone que es la secuencia de bytes EA y por lo tanto solo se queja de que los bytes brutos están equivocados. Primero debes saber qué codificación tienen las cadenas en PHP; que depende de dónde vienen. Luego debe establecer la codificación correcta de la conexión MySQL, de modo que MySQL sepa qué codificación tienen las cadenas que está enviando. Cómo hacerlo depende de cómo se conecte exactamente a la base de datos.

Ver Handling Unicode Front To Back In A Web App para un resumen de todo el proceso.

+0

Hola, la codificación fuente de la cadena en Php es 'utf-8' y proviene de XML. Quiero decir, el XML está codificado como 'utf-8'. –

+0

Luego, verifique que usando 'bin2hex' en la consulta que está enviando a la base de datos, y verifique en qué configuración de su conexión está establecida. – deceze

-1

puede utilizar esta función. mysql_real_escape_string ($ user), mysql_real_escape_string ($ password));

Cuestiones relacionadas