Jun 182014
 
Artículo MySQL

Una de las peculiaridades de MySQL que puede sorprender a los usuarios acostumbrados a otras bases de datos, es el hecho de que las búsquedas realizadas no diferencien caracteres escritos en mayúsculas o en minúsculas.

En muchas ocasiones, este es el tipo de búsqueda que se desea realizar, pero en ocasiones nos interesa realizar una búsqueda que considere diferentes los caracteres en mayúsculas. En este artículo explicamos cómo conseguirlo.

Supongamos que tenemos una instalación de MySQL en la que mantenemos una base de datos, que contiene una tabla ‘clientes’ con un campo ‘nombre’ que contiene el nombre del cliente.

Si realizamos una consulta de los nombres de cliente que empiezan por la letra ‘p’, nos podemos encontrar con el siguiente resultado:

como vemos, entre los resultados aparececen valores que comienzan por la letra ‘p’ minúscula, y también por la letra ‘P’ mayúscula.

Esto se debe a la “secuencia de ordenación” (‘collation sequence’) que mysql ha aplicado a la hora de realizar la consulta. En mysql, se define una ‘secuencia de ordenación’ por defecto para todo el servidor, y se puede definir también una ‘collation sequence’ a nivel de base de datos, de tabla, e incluso de cada campo.

La secuencia de ordenación está relacionada con el “conjunto de caracteres” (character set) utilizado para ejecutar la consulta. El conjunto de caracteres, al igual que la secuencia de ordenación puede ser establecido a nivel de sistema, base de datos, tabla o campo.

Para realizar una búsqueda que diferencie mayúsculas de minúsculas, hay distintas posibilidades:

1. Utilizar el modificador “BINARY”

Ejemplo:

2. Especificar en la propia sentencia select la secuencia de ordenación a utilizar:

En el ejemplo, estamos indicando que el campo “nombre” debe ser tratado conforme a la secuencia de ordenación “latin1_general_cs”.

latin1_general_cs es una secuencia de ordenación que distingue entre minúsculas y mayúsculas, y es válida para un campo cuyo conjunto de caracteres es “latin1”.

Sin embargo, si el conjunto de caracteres utilizado por el campo “nombre” fuera “utf8”, la misma sentencia nos daría un error:

En este caso, podemos utilizar la secuencia de ordenación “utf8_bin”, que es válida para el conjunto de caracteres “utf8”, y también distingue entre mayúsculas y minúsculas:

Alternativamente, podemos realizar la conversión a “latin1” de los valores del campo “nombre”, en la misma sentencia SELECT:

Pero hay que tener en cuenta que esta sentencia podría dar error si alguno de los valores contiene caracteres que no se pueden convertir a “latin1”.

Conjuntos de caracteres y secuencias de ordenación

Los conjuntos de caracteres disponibles en una instalación de MySQL se obtienen con el comando “SHOW CHARACTER SET”

Del mismo modo, las secuencias de ordenación disponibles en un sistema se obtienen con el comando “SHOW COLLATION”:

Secuencias de ordenación válidas para un conjunto de caracteres

Como hemos visto, el comando SHOW COLLATION genera un listado de todas las secuencias de ordenación disponibles en un sistema, incluyendo una columna “Charset” que indica el conjunto de caracteres al que se aplica. Por lo tanto, es fácil obtener una relación de las secuencias de ordenación aplicables a un determinado conjunto de caracteres, filtrando la salida de este comando.

Por ejemplo, las secuencias de ordenación válidas para el conjunto de caracteres “latin1” son:

El sufijo “_ci” (case insensitive) indica que la secuencia de ordenación no distingue entre mayúsculas o minúsculas. Por el contrario, el prefijo “_cs” (case sensitive) se aplica a secuencias de ordenación que sí distinguen entre mayúsculas o minúsculas.

Para todos los conjuntos de caracteres existe también una secuencia de ordenación con sufijo “_bin”. En las secuencias de ordenación “_bin”, la ordenación se realiza utilizando el valor binario con el que se almacena cada carácter. Por lo tanto, las secuencias de ordenación “_bin” también distinguen entre mayúsculas y minúsculas.

Secuencia de ordenación por defecto del sistema

La secuencia de ordenación por defecto del sistema se puede obtener consultando las variables “collation*”:

Secuencia de ordenación por defecto de una base de datos

La secuencia de ordenación por defecto de una base de datos se puede especificar a la hora de crearla:

Y se puede modificar posteriormente con un comando “ALTER DATABASE”

Secuencia de ordenación por defecto de una tabla

La secuencia de ordenación utilizada por una tabla “NOMBRE_DE_TABLA” se puede consultar con el comando:

Para modificar la secuencia de ordenación de una tabla, se utiliza el comando “ALTER TABLE”:

Secuencia de ordenación por defecto de un campo

 

 

Referencias

Indice de artículos sobre MySQL

 Publicado por en 6:59 pm

 Deja un comentario

(requerido)

(requerido)