que tienen que rediseñar una clase donde (entre otras cosas) cadenas UTF-8 son de doble codificado erróneamente:¿Cómo corregir cadenas de doble codificación UTF-8 ubicadas en los campos de MySQL utf8_general_ci?
$string = iconv('ISO-8859-1', 'UTF-8', $string);
:
$string = utf8_encode($string);
Estas cadenas defectuosas se han guardado en múltiples campos de la tabla por toda una base de datos MySQL. Todos los campos afectados se usan la intercalación utf8_general_ci
.
Normalmente configuraba un pequeño script de parche PHP, recorriendo las tablas afectadas, SELECCIONANDO los registros, corrigiendo los registros defectuosos usando utf8_decode()
en los campos de doble codificación y ACTUALIZANDO los mismos.
Como esta vez obtuve muchas y enormes tablas, y el error solo afecta las diéresis alemanas (äöüßÄÖÜ), me pregunto si hay una solución más inteligente/más rápida que eso.
¿Son las soluciones puras de MySQL como las siguientes seguras y recomendables?
UPDATE `table` SET `col` = REPLACE(`col`, 'ä', 'ä');
¿Alguna otra solución/mejores prácticas?
D'oh, .. éste literalmente 'me golpeó' fuera de la silla (juego de palabras ^^)! Gracias por sacar esto de tu bolsa mágica. Funcionó como un amuleto y me desactivó de cualquier preocupación sobre problemas de "falta de memoria". Solo tuve que usar 'CHANGE' en lugar de' MODIFY'. Por cierto, noté que al cambiar a charset 'latin1' implícitamente cambió la intercalación a' latin1_swedish_ci'. ¿Sería más seguro agregar 'COLLATE latin1_swedish_ci' para forzar esto? Lo mismo ocurre con 'binary' (intercalación conmutada a' none') y 'utf8' (la colación conmutada vuelve a' utf8_general_ci'). Gracias de nuevo. Me guardaste la noche ^^ –
Creo que cada vez que cambias el conjunto de caracteres, si no especificas una intercalación, la intercalación será la clasificación predeterminada para el nuevo conjunto de caracteres. La intercalación no debería importar para los primeros dos cambios, porque solo está usando temporalmente ese juego de caracteres, y la intercalación no tiene ninguna relación con AFAIK sobre cómo se almacenan los caracteres en la tabla o qué caracteres se almacenan. Solo la codificación importa en esos dos cambios. Por lo tanto, solo deberá especificar una intercalación para el cambio final, en la que la cambie de nuevo a UTF-8. Pero si me equivoco, doy la bienvenida a que me corrijan. – Hammerite
Gracias por seguir explicando sobre esto. Se encontró una página en la documentación de MySQL que confirma sus opiniones sobre una alternativa [intercalación predeterminada] (http://dev.mysql.com/doc/refman/5.6/en/charset-table.html). Forzar una intercalación en el último cambio solo tiene sentido para mí también. Lo hará –