Você pode começar usando
SOUNDEX()
, isso provavelmente servirá para o que você precisa (imagino uma caixa de sugestão automática de alternativas já existentes para o que o usuário está digitando). As desvantagens de
SOUNDEX()
estão:- sua incapacidade de diferenciar strings mais longas. Apenas os primeiros caracteres são levados em consideração, strings mais longas que divergem no final geram o mesmo valor SOUNDEX
- o fato de que a primeira letra deve ser a mesma ou você não encontrará uma correspondência facilmente. O SQL Server tem a função DIFFERENCE() para informar o quanto dois valores SOUNDEX estão separados, mas acho que o MySQL não tem nada desse tipo embutido.
- para MySQL, pelo menos de acordo com o documentos , SOUNDEX está quebrado para entrada unicode
Exemplo:
SELECT SOUNDEX('Microsoft')
SELECT SOUNDEX('Microsift')
SELECT SOUNDEX('Microsift Corporation')
SELECT SOUNDEX('Microsift Subsidary')
/* all of these return 'M262' */
Para necessidades mais avançadas, acho que você precisa ver a distância de Levenshtein (também chamado de "editar distância") de duas strings e trabalhar com um limite. Esta é a solução mais complexa (=mais lenta), mas permite maior flexibilidade.
A principal desvantagem é que você precisa de ambas as cordas para calcular a distância entre elas. Com o SOUNDEX você pode armazenar um SOUNDEX pré-calculado em sua tabela e comparar/classificar/agrupar/filtrar nele. Com a distância Levenshtein, você pode descobrir que a diferença entre "Microsoft" e "Nzcrosoft" é de apenas 2, mas levará muito mais tempo para chegar a esse resultado.
Em qualquer caso, um exemplo de função de distância Levenshtein para MySQL pode ser encontrado em codejanitor.com:Distância Levenshtein como uma função armazenada do MySQL (10 de fevereiro de 2007) .