2010-12-07 11 views
13

mi procedimiento almacenado en MySQL falla con Mysql::Error: Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '='.Combinación ilegal de intercalaciones en el procedimiento almacenado

El procedimiento falla cuando en la cláusula SELECT intenta comparar una columna VARCHAR con el parámetro VARCHAR pasado a este procedimiento.

Todas las columnas de mis tablas tienen utf8_unicode_ci intercalación. La recopilación de la base de datos es la misma. Incluso he especificado la intercalación en `/config/database.yml.

Sin embargo, cuando corro /script/console he puesto siguientes variables:

>> ActiveRecord::Base.connection.select_rows "show variables like '%colla%'" 
=> [["collation_connection", "utf8_general_ci"], ["collation_database", "utf8_unicode_ci"], ["collation_server", "utf8_general_ci"]] 

y posiblemente el hecho más interesante es que tengo otra base de datos en el mismo servidor MySQL con las mismas colaciones (incluso las consultas a las variables de intercalación de La consola Rails da los mismos resultados) que ejecuta este procedimiento almacenado sin ningún problema.

Gracias por su ayuda.

+0

simplemente descubrí que uno de mis cuadros ha ordenación establecida en conjunto 'utf8_general_ci' que es inproper en mi base de datos y esto es la razón. Gracias por pasar tiempo en esta pregunta. – skalee

Respuesta

17

Para solución rápida,

SELECT * FROM YOUR_TABLE 
WHERE [email protected]_VARIABLES COLLATE utf8_general_ci; 

O

SELECT * FROM YOUR_TABLE 
WHERE [email protected]_VARIABLES COLLATE unicode_ci; 
/* depends on the collation for YOUR_COL */ 

solución permanente

Probablemente tendría que volver a crear la base de datos utilizando la derecha/misma intercalación

+1

+1 Gracias por su respuesta. Los enlaces que ha publicado son muy útiles e introducen cierta información no mencionada (o no mencionada claramente) en la sección de manual relacionada con conjuntos de caracteres. En realidad, tu respuesta me condujo indirectamente a la razón real. – skalee

+1

Además de la respuesta de @ajreal: Quizás es bueno saber que cuando usa varias declaraciones, TODAS ELLAS necesitan la instrucción COLLATE. Entonces sería 'SELECT * FROM YOUR_TABLE WHERE YOUR_COL1 = @ YOUR_VARIABLES1 COLLATE unicode_ci Y YOUR_COL2 = @ YOUR_VARIABLES2 COLLATE unicode_ci Y YOUR_COL3 = @ YOUR_VARIABLES3 COLLATE unicode_ci; Me tomó un tiempo darme cuenta de eso. ' – Michel

Cuestiones relacionadas