2010-03-05 38 views
11

Estoy tratando de lograr una ordenación acentuada y que no distinga entre mayúsculas y minúsculas en MySQL. Siguiendo las instrucciones del manual, se supone que esto funciona con el conjunto de caracteres utf8 y la intercalación utf8_general_ci.Clasificación insensible a los acentos en MySQL

Cuando yo sigo el ejemplo en el manual (http://dev.mysql.com/doc/refman/5.1/en/charset-collation-implementations.html) bajo "intercalaciones de caracteres Unicode multi-byte conjuntos" no consigo los mismos resultados:

Welcome to the MySQL monitor. Commands end with ; or \g. 
Your MySQL connection id is 679877 
Server version: 5.1.41-log MySQL Community Server (GPL) by Remi 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 

mysql> SET NAMES 'utf8' COLLATE 'utf8_general_ci'; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT 'a' = 'A', 'a' = 'À', 'a' = 'á'; 
+-----------+-----------+-----------+ 
| 'a' = 'A' | 'a' = 'À' | 'a' = 'á' | 
+-----------+-----------+-----------+ 
|   1 |   0 |   0 | 
+-----------+-----------+-----------+ 
1 row in set (0.00 sec) 

mysql> 

En el ejemplo en el manual, los que son todos 1.

Tampoco trata a los caracteres acentuados por igual cuando intento establecer la intercalación directamente en una consulta. En este ejemplo, la tabla está utilizando latin1 y estoy convirtiendo a utf8.

mysql> select * from test; 
+----------+ 
| k  | 
+----------+ 
| Cárdenas | 
| Cardozo | 
| Corbin | 
| Cabrero | 
+----------+ 

mysql> select k from test order by convert(k using utf8) collate utf8_general_ci 
; 
+----------+ 
| k  | 
+----------+ 
| Cabrero | 
| Cardozo | 
| Corbin | 
| Cárdenas | 
+----------+ 
4 rows in set (0.00 sec) 

Debe ignorar el acento sobre la 'a' en la última entrada y ordenarla en segundo lugar. ¿Alguna idea de lo que estoy haciendo mal?

+0

podría por favor agregue a su pregunta la salida de 'VER COLUMNAS completos de prueba;' –

+1

consigo todo 1 para el seleccione, entonces debe haber algo mal con sus colaciones en MySQL. –

+1

¿Está la consola donde está escribiendo todas estas pruebas configuradas para manejar la entrada del teclado como UTF-8? –

Respuesta

0

puede ser que falte algo aquí ... pero no puedes hacer una función (por ejemplo removeAccents) que toma una cadena y devuelve la cadena equivalente sin acento, y luego ordenar por removeAccents(field). Creo que también puede crear un índice para eso, lo que debería ayudar con el rendimiento.

2

Funciona en mi instalación predeterminada de MySQL. Como no ha proporcionado SHOW FULL COLUMNS de la prueba (@fsb comment), aún es posible que la intercalación en la estructura de la tabla sea incorrecta.

  • ¿Está el cotejo de la columna 'k' se establece en algo distinto de utf8_general_ci?

  • Compruebe si k SELECT de Nombres ORDER BY k ASC está dando la respuesta correcta

  • ¿Se ha modificado el archivo de instalación de MySQL Index.xml a cambiar el significado de utf8_general_ci?

Parte pertinente de mi instalación para la comparación:

<charset name="utf8"> 
    <family>Unicode</family> 
    <description>UTF-8 Unicode</description> 
    <alias>utf-8</alias> 
    <collation name="utf8_general_ci" id="33"> 
    <flag>primary</flag> 
    <flag>compiled</flag> 
    </collation> 
    <collation name="utf8_bin" id="83"> 
    <flag>binary</flag> 
    <flag>compiled</flag> 
    </collation> 
</charset> 
  • ¿Se ha modificado el código compilado para cambiar el significado de utf8_general_ci?

concebible que alguien más ha ajustado una de estas cosas para algún propósito nefasto ...

Cuestiones relacionadas