2010-04-09 13 views
25

Estos dos querys me da exactamente el mismo resultado:MySQL trata a ÅÄÖ como AAO?

select * from topics where name='Harligt'; 
select * from topics where name='Härligt'; 

¿Cómo es esto posible? Parece que mysql traduce åäö a aao cuando busca. ¿Hay alguna forma de apagar esto?

Utilizo la codificación utf-8 en todos lados, hasta donde yo sé. El mismo problema ocurre tanto desde la terminal como desde php.

Respuesta

31

Sí, este es un comportamiento habitual en las intercalaciones Unicode no lingüísticas específicas.

9.1.13.1. Unicode Character Sets

Para ilustrar adicionalmente, las siguientes igualdades mantenga tanto en utf8_general_ci y utf8_unicode_ci (para el efecto que esto tiene en las comparaciones o al hacer búsquedas, ver la Sección 9.1.7.7, “Ejemplos del efecto de una colación “):

a = a Ö = O U = U

Consulte también Examples of the effect of collation

Necesitas sea

  • utilizar una intercalación que no tiene esta "característica" (es decir, utf8_bin, pero que tiene otras consecuencias)

  • utilizar una intercalación diferente para la consulta solo. Esto debería funcionar:

    select * from topics where name='Harligt' COLLATE utf8_bin; 
    

se hace más difícil si se quiere hacer un caso insensible LIKE pero no tienen la conversión Ä = A diéresis. No conozco ninguna intercalación mySQL que no distinga entre mayúsculas y minúsculas y no hace este tipo de conversión umlaut implícita. Si alguien conoce uno, me interesaría saberlo.

relacionadas:

4

Ya que estás en Suecia se lo recomiendo el uso de la colación sueca.He aquí un ejemplo que muestra la diferencia que hace:

CREATE TABLE topics (name varchar(100) not null) CHARACTER SET utf8; 

INSERT topics (name) VALUES ('Härligt'); 

select * from topics where name='Harligt'; 
'Härligt' 

select * from topics where name='Härligt'; 
'Härligt'  

ALTER TABLE topics MODIFY name VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_swedish_ci; 

select * from topics where name='Harligt'; 
<no results> 

select * from topics where name='Härligt'; 
'Härligt' 

Nótese que en este ejemplo sólo ha cambiado una columna a colación sueca el, pero probablemente debería hacerlo para toda su base de datos, todas las tablas, todas las columnas varchar.

+0

Esto debería funcionar para otros idiomas distintos del sueco, así que creo que utf8_bin es la colación que quiero, pero gracias por informarme que puedo cambiar la intercalación en una sola columna, eso será de gran ayuda. – Martin

+0

Tenga en cuenta que utf8_bin distingue entre mayúsculas y minúsculas, por lo que "härligt"! = "Härligt" (también se aplica a índices únicos). – serbaut

Cuestiones relacionadas