upper minusculas mayusculas lower ignorar ejemplo distinguir diferenciar buscar mysql sql character-encoding case-sensitive mysql-error-1267

minusculas - mysql mayusculas



Búsqueda de mayúsculas y minúsculas en MYSQL para el campo utf8_bin (4)

Creé una tabla y configuré la intercalación en utf8 para poder agregar un índice único a un campo. Ahora necesito hacer búsquedas que no distingan entre mayúsculas y minúsculas, pero cuando realicé algunas consultas con la palabra clave de clasificación y obtuve:

mysql> select * from page where pageTitle="Something" Collate utf8_general_ci;

ERROR 1253 (42000): LA COLECCIÓN ''utf8_general_ci'' no es válida para el CONJUNTO DE PERSONAJES ''latin1''

mysql> select * from page where pageTitle="Something" Collate latin1_general_ci;

ERROR 1267 (HY000): Mezcla ilegal de colaciones (utf8_bin, IMPLICIT) y (latin1_general_ci, EXPLICIT) para la operación ''=''

Soy bastante nuevo en SQL, así que me preguntaba si alguien podría ayudar.


¿Puedo preguntar por qué tiene la necesidad de cambiar explícitamente la intercalación cuando hace un SELECT? ¿Por qué no simplemente cotejar la forma en que desea recuperar los registros cuando se ordenan?

El problema que tiene con las búsquedas que distinguen entre mayúsculas y minúsculas es que tiene una intercalación binaria. Intente en su lugar utilizar la colación general. Para obtener más información sobre la distinción entre mayúsculas y minúsculas y comparaciones, consulte aquí: Sensibilidad a mayúsculas y minúsculas en las búsquedas de cadenas


Prueba esto, esta funcionando para mi

SELECCIONAR * DESDE users DONDE SUPERIOR ( name ) = SUPERIOR (''josé'') COLLATE utf8_bin;


También tenga en cuenta que en caso de usar "Collate utf8_general_ci" o "Collate latin1_general_ci", es decir, "forzar" la clasificación: ¡tal conversión evitará el uso de los índices existentes! Esto podría ser un cuello de botella en el futuro para el rendimiento.


Una cadena en MySQL tiene un conjunto de caracteres y una intercalación . Utf8 es el conjunto de caracteres, y utf8_bin es una de sus intercalaciones. Para comparar su cadena literal con una columna utf8, conviértala a utf8 prefijándola con la notación _charset:

_utf8 ''Something''

Ahora una intercalación solo es válida para algunos conjuntos de caracteres. La intercalación que distingue entre mayúsculas y minúsculas para utf8 parece ser utf8_bin, que puede especificar como:

_utf8 ''Something'' collate utf8_bin

Con estas conversiones, la consulta debería funcionar:

select * from page where pageTitle = _utf8 ''Something'' collate utf8_bin

El prefijo _charset funciona con cadenas literales. Para cambiar el conjunto de caracteres de un campo, hay CONVERTIR ... USAR. Esto es útil cuando desea convertir el campo de título de página a otro conjunto de caracteres, como en:

select * from page where convert(pageTitle using latin1) collate latin1_general_cs = ''Something''

Para ver el carácter y la intercalación de una columna llamada ''col'' en una tabla llamada ''TAB'', intente:

select distinct collation(col), charset(col) from TAB

Se puede encontrar una lista de todos los conjuntos de caracteres y colaciones con:

show character set show collation

Y todas las colaciones válidas para utf8 se pueden encontrar con:

show collation where charset = ''utf8''