Pregunta

He creado un conjunto de mesa y la colación a utf8 con el fin de ser capaz de añadir 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:

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.

¿Fue útil?

Solución

Una cadena en MySQL tiene un carácter fijar y una colación . UTF-8 es el juego de caracteres y utf8_bin es uno de sus colaciones. 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 sólo es válida para algunos juegos de caracteres. El caso- sensibles intercalación para UTF-8 parece estar 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 literales de cadena. Para cambiar el juego de caracteres de un campo, no es convertir ... USO. 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', prueba:

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:

show collation where charset = 'utf8'

Otros consejos

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

Prueba de esto, su trabajo para mí

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

¿Puedo preguntar por qué tiene una necesidad de cambiar de forma explícita la colación cuando se hace un SELECT? ¿Por qué no sólo de clasificado en la forma en que desea recuperar los registros ordenados cuando?

El problema que tiene con sus búsquedas estar entre mayúsculas y minúsculas es que usted tiene una intercalación binaria. Trate en lugar de utilizar la clasificación general. Para obtener más información acerca de la sensibilidad caso y colaciones, mira aquí: de mayúsculas y minúsculas en la cadena Búsquedas

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top