2011-05-19 13 views
9

Rails 2.3.5 y 1.8.7 de Ruby y MySQL 5.1.53rieles MySQL codificación de emisión/interrogación - MySQL :: Error: mezcla ilegal de colaciones (latin1_swedish_ci, implícita) y (utf8_general_ci, coercible)

Im carga en un archivo csv, que tiene un campo de ese símbolo TM en el mismo (marca registrada)

Tart Deco ™ - se parece a esto

que estoy tratando de hacer un registro activo hallazgo:

Influencer.find (: primero,: condiciones => ["author_name =? y url_discovered =?", author_name, site_pr ofile_url])

MySQL :: Error: la mezcla ilegal de colaciones (latin1_swedish_ci, implícita) y (utf8_general_ci, coercible) para la operación '=': SELECT * FROM influencers DONDE (author_name = 'Tart Deco?' y url_discovered = ' http://www.joelnylund.com ') LIMIT 1

En depurador rubí la cadena se muestra como:

p author_name "Tart Deco \ 231"

Mi mesa está codificado "utf8_general_ci"

Entonces, ¿qué debo hacer? Realmente no me importa mucho si almaceno la TM, sería bueno, principalmente, simplemente no quiero que se rompa ...

+0

acertada solución por ahora, elimine los caracteres no ascii - http: // stackoverflow.com/questions/1268289/how-to-get-rid-of-non-ascii-characters-in-ruby – Joelio

Respuesta

0

Quizás no sea la respuesta más útil, pero acabo de lanzar una prueba de muestra en Rails 3 w/Ruby 1.9.2 y funcionó bien. Entiendo que la codificación de caracteres se revisó principalmente en Ruby 1.9.

Nota: En mi prueba de que acabo de copiar el texto y en los carriles de la consola

:001 > author_name = 'Tart Deco™' 
=> "Tart Deco™" 
:002 > Influencer.find(:first,:conditions => ["author_name = ?", author_name]) 
=> nil 

Por supuesto, sólo fudged un modelo influyente w/no hay registros. Pero MySQL no perdió. Entonces, agregué un registro a mi modelo con ese nombre y lo recuperé bien.

HTH

+0

No puedo cambiar versiones de ruby ​​o rieles en este momento. – Joelio

+0

ruby ​​1.9.2 tiene un mejor controlador de codificación de cadenas. no es una cuestión de rieles. –

1

su problema es algo relacionado al rubí 1.8 y sus personajes que codifican gestión. intente forzar la conversión de texto leído de CSV, de ASCII a UTF8, usando Iconv.

ejemplo sencillo:

csv_text = SOME_CSV_READ_CODE # get the string or text 
# instantiate a Iconv converter from generic ASCII to UTF8, ignoring errors 
converter = Iconv.new('UTF-8//IGNORE', 'ASCII//IGNORE') 
# clean string from unrecognized chars 
utf8_text = converter.iconv(csv_text).unpack('U*').select{ |cp| cp < 127 }.pack('U*') 

en su caso, se debe convertir parámetro author_name (al menos) antes de usarla en su consulta. asegúrese de hacer lo mismo al guardar texto/cadenas en db, o obtendrá errores similares durante las inserciones/actualizaciones.

0

Quería hacer una pregunta acerca de cómo está cargando los datos en cuestión, pero aparentemente la "cola de edición está llena". ¿Está utilizando raíles para cargar el archivo e insertarlo en la base de datos o está utilizando una de las opciones de MySQL como 'cargar datos ... infilar ...'?

Cuestiones relacionadas