it-swarm.dev

Como conduzir uma pesquisa sensível ao sotaque no MySql

Eu tenho uma tabela MySQL com utf8 geral ci collation. Na tabela, vejo duas entradas:

uma má
uma má

Eu estou usando uma consulta que se parece com isso:

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

O resultado da consulta fornece as duas palavras:

uma má
uma má

Existe uma maneira de indicar que eu só quero que o MySQL encontre a palavra acentuada? Eu quero que a consulta retorne somente 

uma má 

Eu também tentei esta consulta:

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

Não me dá resultados. Obrigado pela ajuda.

57
Chris

Se as pesquisas nesse campo sempre forem sensíveis ao acento, declare o agrupamento do campo como utf8_bin (que compara a igualdade com os bytes codificados pelo utf8) ou use um agrupamento específico do idioma que faça a distinção entre o acentuado eo un. caracteres acentuados. 

col_name varchar(10) collate utf8_bin

Se as pesquisas forem normalmente insensíveis ao sotaque, mas você quiser abrir uma exceção para essa pesquisa, tente;

WHERE col_name = 'abád' collate utf8_bin
81
user8599

Na minha versão (MySQL 5.0), não há nenhum conjunto de charset utf8 para pesquisas sensíveis a sotaque e insensíveis a maiúsculas e minúsculas. O único agrupamento sensível ao sotaque para utf8 é utf8_bin. No entanto, também é sensível a maiúsculas e minúsculas.

Meu trabalho tem sido usar algo assim:

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

O bug do MySQL, para referência futura, é http://bugs.mysql.com/bug.php?id=19567 .

3
colan

Eu estava recebendo o mesmo erro.

Eu mudei o agrupamento da minha tabela para utf8_bin (através do phpMyAdmin) e o problema foi resolvido.

Espero que ajude! :)

1
Silvio Delgado

Verifique se o tipo de agrupamento da tabela de banco de dados termina com "_ci". Isso significa que não diferencia maiúsculas de minúsculas ...

Altere para collation o mesmo nome ou o nome mais próximo sem o "_ci" ...

Por exemplo ... altere "utf8_general_ci" para "utf8_bin" Mke

1
Mike

A resposta aceita é boa, mas tenha cuidado para usar o COLLATE utf8mb4_bin!

WHERE col_name = 'abád' collate utf8mb4_bin

Acima corrige erros como:

MySQL disse: Documentação 1253 - COLLATION 'utf8_bin' não é válida para CHARACTER SET 'utf8mb4'

0
Robert Sinclair

Bem, você acabou de descrever o que é a colação utf8_general_ci (a, á, à, â, ä, å tudo igual a um em comparação).

Também houve mudanças no servidor MySQL 5.1 em relação a utf8_general_ci e utf8_unicode_ci, assim também depende da versão do servidor. Melhor verificar os documentos.

Então, se é o MySQL server 5.0, eu usaria utf8_unicode_ci ao invés de utf8_general_ci, o que obviamente é errado para o seu caso de uso.

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

(ou seu collation incluindo cs)

0
cjk

Você pode tentar pesquisar a variável hexadecimal do caractere, HEX () dentro do mysql e usar uma função similar dentro de sua linguagem de programação e combiná-las. Isso funcionou bem para mim quando eu estava fazendo uma lista onde uma pessoa poderia selecionar a primeira letra de uma pessoa.

0
Ólafur Waage

Isso funciona para mim para uma busca insensível ao sotaque e insensível a maiúsculas e minúsculas no servidor MySql 5.1 em um banco de dados em utf8_general_ci, onde column é um LONGBLOB.

select * from words where '%Word%' LIKE column collate utf8_unicode_ci

com 

select * from words where'%Word%' LIKE column collate utf8_general_ci

o resultado faz distinção entre maiúsculas e minúsculas, mas não é sensível ao sotaque.

0
Mónica Cifuentes