18 julio 2010

Error Code: 1267 Illegal mix of collations

Hoy mientras trataba de ejecutar un select entre dos tablas, en mySQL, recibí el siguiente mensaje de error:
Error Code: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (latin1_spanish_ci,IMPLICIT) for operation '=')
Para entender este error primero veamos en qué consiste un COLLATION, segun sqlinfo.net :
"A character set is a set of symbols and encodings. collation is a set of rules for comparing characters in a character set." 
 Ok, luego de ver esto es importante hacer notar que el proyecto que vengo trabajando, trabaja con una base de datos mysql gestionada originalmente mediante la herramienta phpAdmin, y esta emplea por defecto el collation "latin1_swedish_ci" para crear sus tablas. Por mi parte los scripts de las tablas que debía agregar los hice mediante mi herramienta mySQL Workbench con el collation "latin1_spanish_ci" por defecto.

El problema viene al momento de efectuar la comparación, dado que las tablas, ya existentes como las que agregué yo, poseen collations diferentes la base de datos no puede determinar que reglas de comparación empleará para operaciones que las involucren juntas. Por esta razón, para salvar este problema agregamos la clausula COLLATE 'nombre_del_collation' para decirle a la BD qué reglas emplear. A continuación, un pequeño ejemplo de cómo quedaría nuestra sentencia.

SELECT e.column_id INTO tmp_id FROM tabla1 e INNER JOIN tabla2 m ON e.column_id = m.column_foreign_id_1 INNER JOIN table3 p ON p.column_id = m.column_foreign_id_2 WHERE p.column_id = valor_de_comparacion COLLATE 'latin1_spanish_ci';

No hay comentarios.: