2010-02-15 11 views
8

He intentado crear mis tablas mysql con conjuntos de UTF-8 y Latin1 Char. Cuando uso Latin1 mis índices se usan, cuando uso UTF-8, los índices no se usan al seleccionar/limitar registros. ¿Hay algo que me falta con los conjuntos de Char que hace que esto suceda?UTF-8 vs Latin1 mysql, índices no utilizados en utf-8

Saludos

Ke

Respuesta

7

Los índices solo se pueden usar cuando la intercalación de la expresión coincide con la de la columna indexada.

Si la expresión es COERCIBILITY es menor que la de la columna (es decir, 2), la intercalación de la columna se convierte en la de la expresión y el índice no se utiliza.

Normalmente, los literales tienen COERCIBILITY de 4 y las variables de usuario de 3, por lo que esto no debería ser un problema.

Sin embargo, si mezcla diferentes intercalaciones en un JOIN o UNION, no se garantiza el orden del elenco.

En este caso, debe proporcionar el cotejo explícita a la columna de su son de fundición (muy probablemente, quieres lanzar latin1 a UTF8), y esto debe ser la intercalación de la columna que está echando a:

SELECT * 
FROM utf_table 
JOIN latin_table 
ON  utf_column = latin_column COLLATE UTF8_GENERAL_CI 
+0

Gracias @Quassnoi ¿podría proporcionar algún documento oficial sobre esto? Quiero saber más. – zhuguowei

+0

@zhuguowei: http://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_coercibility – Quassnoi

+0

¡Gracias! pero quiero saber más de esto: 'Los índices se pueden usar solo cuando la intercalación de la expresión coincide con la de la columna indexada'. Porque recientemente conocí este problema' donde a.user_id (UTF8MB4_UNICODE_CI) = b.user_id (utf8_bin) ' y tanto la tabla 'user_id' está indexada y en realidad es muy lenta, explícitamente el índice no funciona. – zhuguowei

3

entiendo esto ahora, las mesas que me unía no eran de la misma conjunto de caracteres

DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

Una vez que cambié estos los índices funcionaba bien.

1

Los índices se almacenan con la misma codificación que las columnas que están indexando. La comparación de un carácter UTF-8 con un carácter latin1 no puede hacer uso del índice, ya que necesitaría convertir ambos a la misma codificación, ya que las optimizaciones del índice se realizan en un nivel de bytes (y ß en latin1 tiene una secuencia de bytes diferente en UTF-8).