Cuando tenemos que buscar dentro de un campo determinada cadena de texto podemos encontrarnos con la dificultad de de distinguir entre mayúsculas y minúsculas.
El charset (en español cotejamiento) es la respuesta a nuestro conflicto, éste es definido al momento de crear el campo, podemos decir que es case sensitive (cs) o que no lo es (ci)
Sí no elegimos un charset el campo tomará como predeterminado el charset de la tabla, cuando la creamos debemos indicarlo.
Empecemos creando una tabla indicando un charset que no sea case sensitive
CREATE TABLE `personas` (
`id` INT(11) NOT NULL DEFAULT '0',
`nombre` VARCHAR(255) NOT NULL,
`apellido` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci;
Supongamos que yo tengo el siguiente registro
1 Daniel Segovia
Busquemos la cadena de texto “daniel” (en minúscula) en el campo nombre
SELECT * FROM personas WHERE nombre LIKE 'daniel'
MySQL me devolverá este registro ya que el campo nombre no esta definido como case sensitve
Cambiemos el charset de una tabla case sensitive (latin1_spanish_ci) a no case sensitive (latin1_bin)
ALTER TABLE `personas`
CHARSET=latin1 COLLATE=latin1_bin;
Sí realizamos la misma búsqueda que hicimos antes el resultado sería el mismo, nos devolvería el registro. Esto se debe a que no estamos cambiando el charset del campo nombre, solo estamos cambiando la definición de la tabla, esto producirá que cuando se cree un campo de texto nuevo y no se defina un charset este ahora será latin1_bin.
Para cambiar la definición del campo debemos hacerlo con el siguiente código
ALTER TABLE `personas`
CHANGE `nombre` `nombre` VARCHAR( 255 )
CHARACTER SET latin1 COLLATE latin1_bin
Ahora sí dentro de una consulta “Daniel” será distinto de “daniel” entonces la consulta previa que realizamos no nos retornará ningún resultado.
Por último, sí tenemos un campo que es case sensitive podemos realizar una búsqueda y decirle al motor de base de datos para ésta búsqueda que no sea case sensitive
SELECT * FROM `personas` WHERE nombre LIKE 'daniel' COLLATE utf8_spanish_ci