18

Creé una tabla y establecí la intercalación en utf8 para poder agregar un índice único a un campo. Ahora tengo que hacer caso búsquedas insensibles, pero cuando he realizado algunas consultas con la palabra clave de clasificar y tengo:Búsqueda sensible a mayúsculas y minúsculas de MYSQL para el campo utf8_bin

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

ERROR 1253 (42000): compilación 'utf8_general_ci' no es válido para CARACTERES ' latin1'

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

ERROR 1267 (HY000): mezcla ilegal de intercalaciones (utf8_bin, implícita) y (latin1_general_ci, explícitos) para el funcionamiento '='

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

Respuesta

40

Una cadena en MySQL tiene un character set and a collation. Utf8 es el conjunto de caracteres, y utf8_bin es una de sus intercalaciones. Para comparar su cadena literal a una columna de UTF-8, UTF-8 convertirlo en prefijándolo con la notación _charset:

_utf8 'Something' 

Ahora una colación es válido sólo para algunos conjuntos de caracteres. El caso- aparece sensibles intercalación para UTF-8 que se utf8_bin, que se 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 trabaja con cadenas literales . Para cambiar el conjunto de caracteres de un campo, hay CONVERTIR ... UTILIZANDO. Esto es útil cuando se desea convertir el campo pageTitle 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 

Una lista de todos los juegos de caracteres y colaciones se puede encontrar con:

show character set 
show collation 

y todas las colaciones válidas para UTF-8 se puede encontrar con:

+1

Impresionante - Tuve un problema similar pero necesitaba latin1 en lugar de utf8, _latin1 hizo el trabajo por mí. –

1

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

El problema que está teniendo con sus búsquedas es que distingue entre mayúsculas y minúsculas es que tiene una intercalación binaria. Intente utilizar la intercalación general. Para obtener más información acerca de la distinción de mayúsculas y minúsculas, consulte aquí: Case Sensitivity in String Searches

+4

Pero, ¿y si necesito una intercalación binaria, y quiero una búsqueda insensible a mayúsculas y minúsculas. Con la intercalación general, si tiene un campo único, obtendrá un error al intentar insertar 'Čačak' si ya existe 'Cacak'. – umpirsky

2

También tenga en cuenta que en caso de utilizar "Intercalar utf8_general_ci" o "Intercalar latin1_general_ci", es decir, "forzar" la intercalación, ¡dicha conversión impedirá el uso de los índices existentes! Esto podría ser un cuello de botella en el futuro para el rendimiento.

2

Prueba de esto, su trabajo para mí

SELECT * FROM users DONDE SUPERIOR (name) = ALTO ('José') Intercalar utf8_bin;

Cuestiones relacionadas