2012-06-12 9 views
5

Sé que hay muchas preguntas similares sobre SF, pero creo que las mías son lo suficientemente diferentes como para justificar una nueva pregunta. Tengo una tabla que tiene una sola columna como utf8 con utf8_unicode_ci. También tiene una clave única en esta columna junto con otra columna que marca un código de idioma. Los datos en la columna están en muchos guiones diferentes (latín con varios acentos, chino y ruso, entre otros).MySQL Insensible a las mayúsculas pero sensible a los acentos Clave única UTF8

El problema es que a veces quiero ingresar dos palabras con diferentes significados que solo difieren por un signo diacrítico (es decir, año español vs año). Como utf8_unicode_ci es insensible tanto a mayúsculas como a minúsculas, cree que son las mismas y solo me permitirá ingresar una. Eso apesta. Idealmente, cambiaría toda la columna a una intercalación que es sensible a la sensibilidad pero sensible al acento, pero eso no parece existir. Hay muchas cosas diferentes que usan esta columna, por lo que prefiero no cambiar la intercalación predeterminada de la columna a utf8_bin por temor a complicar las cosas con mayúsculas y minúsculas.

Entonces, todo lo dicho, necesito alguna solución que no afecte la sensibilidad de mayúsculas y minúsculas predeterminada en las muchas consultas existentes que afectan a esta columna, pero me permitirá agregar palabras que difieren solo en un signo diacrítico. Ideas? Voy a cambiar solo la restricción de clave única a utf8_bin si es necesario, pero preferiría no, ya que nunca quiero dos cosas en la tabla que difieran solo por caso.

Respuesta

0

Lo único que puedo pensar (sin encontrar una intercalación que se adapte a sus necesidades) es cambiar algo en la capa de aplicación (fuera de MySQL) que se ocupará de la diferenciación.

Por ejemplo, dado que no le importa el caso, puede hacer algo programáticamente para reducir el caso de todas las filas en la base de datos. A continuación, cambie la intercalación a utf8_bin.

Luego puede, en la aplicación, convertir todo en minúsculas antes de ingresar a la base de datos (supongo que esto no afectará a los caracteres diacríticos). De esta forma, aún obtendrás errores si las personas intentan ingresar a varios casos, solo debes cambiar algunas líneas de código para precondicionar cosas que ingresan a la tabla, y no tendrás el problema diacrítico.

+1

Algunos caracteres en mayúsculas no tienen un equivalente en minúsculas. Algunos tienen múltiples equivalentes en minúsculas. Es un desastre. –

0

No tiene que reinventar la rueda pinchada (reinventar la rueda) aquí.

Hay dos colaciones en español en MySQL:

colaciones utf8_spanish_ci (moderna española) y utf8_spanish2_ci (tradicional español)

Estos conocen el idioma lo suficientemente bien como para saber que la N yn sería necesario recabar juntos , pero ese Ñ y ñ son letras diferentes entre N y O. En español, Ñ es en realidad una letra diferente, no un acento.

Establezca su colación de columnas en utf8_spanish_ci y todo funcionará de la manera que desee.

+0

Gracias, pero como he mencionado, no es solo el español lo que me preocupa. Hay cosas en muchos idiomas diferentes. – Eli

+0

Hmm. Las personas que idearon colaciones Unicode son excelentes lingüistas. Si hubiera una solución universal que hiciera lo correcto para todos los idiomas del alfabeto romano, la habrían implementado. Es posible que deba hacer algunas consultas sensibles al idioma, según el idioma de su usuario. Puede colocar una cláusula COLLATE en una instrucción WHERE. –

Cuestiones relacionadas