2009-11-05 63 views
10

Estoy migrando un db de mysql a postgresql. La intercalación predeterminada de mysql db es UTF8, postgres también usa UTF8 y estoy codificando los datos con pg_escape_string(). Por alguna razón, sin embargo, estoy corriendo en algunos errores cobardes sobre mala codificación:PostgreSQL + PHP + UTF8 = secuencia de bytes no válida para la codificación

pg_query() [function.pg-query]: Query failed: ERROR: invalid byte sequence for encoding "UTF8": 0xeb7374 HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client"

he estado hurgando tratando de resolver esto, y se dio cuenta que PHP está haciendo algo raro; si una cadena solo tiene ascii caracteres (por ejemplo, "hola"), la codificación es ASCII. Si la cadena contiene caracteres no ascii, dice que la codificación es UTF8 (por ejemplo, "Hëllo").

Cuando uso utf8_encode() en cadenas que ya son UTF8, mata los caracteres especiales y los desordena, así que ... ¿qué puedo hacer para que esto funcione?

(char exacta colgarlo en este momento es "", pero en lugar de buscar/reemplazar, me gustaría encontrar una mejor solución para este problema un poco no vuelva a suceder)

Respuesta

1

BTW , una cadena ASCII es exactamente la misma en UTF-8 porque comparten los mismos primeros 127 caracteres; Entonces, "Hola" en ASCII es exactamente lo mismo que "Hola" en UTF-8, no necesita conversión.

La intercalación en la tabla puede ser UTF-8, pero es posible que no obtenga información en la misma codificación. Ahora bien, si tiene problemas con la información que proporciona al pg_escape_string, es probable que sea porque está asumiendo que el contenido obtenido de MySQL está codificado en UTF-8, mientras que no lo es. Le sugiero que mire en this page on MySQL documentation y vea la codificación de su conexión; probablemente estés buscando algo de una tabla donde la intercalación es UTF-8 pero tu conexión es algo así como Latin-1 (donde los caracteres especiales como çéèêöà etc. no se codificarán en UTF-8).

+0

Después de algunas horas jugando con esto, estoy empezando a pensar que mysql ha permitido cadenas no utf8 en la base de datos, que es lo que está causando el problema .. – Ian

6

Lo más probable es que los datos en su base de datos MySQL no sean UTF8. Es un escenario bastante común. MySQL al menos solía no hacer ninguna validación adecuada en absoluto sobre los datos, por lo que aceptaba cualquier cosa que le lanzaras como UTF8, siempre y cuando tu cliente afirmara que era UTF8. Es posible que ya hayan solucionado eso (o no, no sé si incluso lo consideran un problema), pero es posible que ya haya codificado incorrectamente los datos en la base de datos. PostgreSQL, por supuesto, realiza una validación completa cuando lo carga y, por lo tanto, puede fallar.

Es posible que desee alimentar los datos a través de algo como iconv que se puede configurar para ignorar caracteres desconocidos, o transformarlos en "mejor estimación".

+0

¡exactamente iconv! Gracias. –

Cuestiones relacionadas