2009-02-01 19 views
52

Tengo una tabla MySQL con utf8 general ci colación. En la mesa, puedo ver dos entradas:Cómo realizar una búsqueda de Accent Sensitive en MySql

Abad
Abád

estoy usando una consulta que tiene el siguiente aspecto:

SELECT * FROM `words` WHERE `word` = 'abád' 

El resultado de la consulta da ambas palabras:

abad
abád

¿Hay alguna manera de indicar que solo w y MySQL para encontrar la palabra acentuada? Quiero que la consulta sólo a volver

Abád

también he tratado de esta consulta:

SELECT * FROM `words` WHERE BINARY `word` = 'abád' 

me da ningún resultado. Gracias por la ayuda.

Respuesta

76

Si sus búsquedas en ese campo siempre serán sensibles al acento, declare la intercalación del campo como utf8_bin (que comparará para igualdad los bytes con codificación utf8) o utilice una intercalación específica del idioma que distinga entre los caracteres acentuados y sin acentos.

col_name varchar(10) collate utf8_bin 

Si las búsquedas son normalmente insensibles a los acentos, pero desea hacer una excepción para esta búsqueda, intente;

WHERE col_name = 'abád' collate utf8_bin 
+0

Gracias por su sugerencia, pero yo Estoy obteniendo: "COLLATION 'utf8_bin' no es válido para CHARACTER SET 'latin1'". – OMA

+0

Por cierto, mi juego de caracteres es realmente "utf8_general_ci", así que no sé por qué dice que el conjunto de caracteres es "latin1". – OMA

+3

@OMA busca el conjunto de caracteres y el cotejo para DB, tabla y columna, todos deben ser los mismos para funcionar correctamente – linuxatico

0
SELECT * FROM `words` WHERE column = 'abád' collate latin1_General_CS 

(o su cotejo incluyendo cs)

0

Puede intentar la búsqueda de la variable hexadecimal del carácter, HEX() dentro de MySQL y utilizar una función similar dentro de su lenguaje de programación y que cumplan estas. Esto funcionó bien para mí cuando estaba haciendo una lista donde una persona podía seleccionar la primera letra de una persona.

0

Bueno, usted acaba de describir lo que el cotejo utf8_general_ci tiene que ver con (a, a, a, a, a, a todos iguales a A en comparación).

También ha habido cambios en el servidor MySQL 5.1 en lo que respecta a utf8_general_ci y utf8_unicode_ci, por lo que depende también de la versión del servidor. Mejor revise los documentos.

Entonces, si es el servidor MySQL 5.0, buscaré utf8_unicode_ci en lugar de utf8_general_ci, lo cual es obviamente incorrecto para tu caso de uso.

11

En mi versión (MySql 5.0), no hay disponible ningún conjunto de caracteres utf8 para las búsquedas sensibles al acento y sin distinción entre mayúsculas y minúsculas. El único cotejo de acento sensible para utf8 es utf8_bin. Sin embargo, también es sensible a mayúsculas.

Mi trabajo alrededor ha sido usar algo como esto:

SELECT * FROM `words` WHERE LOWER(column) = LOWER('aBád') COLLATE utf8_bin 
+2

'# 1253 - COLLATION 'utf8_bin' no es válido para el JUEGO DE CARACTERES 'utf8mb4' ' – User

+1

Luego debe usar utf8mb4_bin. – David

+1

si quieres que no sea sensible a mayúsculas y minúsculas, no olvides también 'LOWER ('the_searched_value')' así obtendrás 'LOWER (column) = LOWER ('aBád')' –

0

Me estaba saliendo el mismo error.

He cambiado la intercalación de mi tabla a utf8_bin (a través de phpMyAdmin) y se solucionó el problema.

Espero que ayude! :)

0

Compruebe si el extremo tipo de intercalación tabla de base de datos con "_ci", Esto significa entre mayúsculas y minúsculas ...

cambiarlo a la intercalación de la misma o la más cercana nombre sin la "_ci" .. .

Por ejemplo ... el cambio "utf8_general_ci" a "utf8_bin" Mke

0

respuesta aceptada es bueno, pero ten en cuenta que puede que tenga que utilizar utf8mb4_bin INTERCALAR lugar!

WHERE col_name = 'abád' collate utf8mb4_bin 

Por encima de correcciones de errores como:

MySQL dijo: Documentación 1253 - COTEJO 'utf8_bin' no es válido para CARACTERES 'utf8mb4'

Cuestiones relacionadas