U kunt beginnen met het gebruik van SOUNDEX()
, zal dit waarschijnlijk doen voor wat je nodig hebt (ik stel me een auto-suggestievak voor met reeds bestaande alternatieven voor wat de gebruiker typt).
De nadelen van SOUNDEX()
zijn:
- het onvermogen om langere strings te onderscheiden. Alleen de eerste paar karakters worden in aanmerking genomen, langere strings die aan het einde divergeren genereren dezelfde SOUNDEX-waarde
- het feit dat de eerste letter hetzelfde moet zijn, anders zul je niet snel een match vinden. SQL Server heeft de DIFFERENCE()-functie om u te vertellen hoeveel twee SOUNDEX-waarden uit elkaar liggen, maar ik denk dat MySQL niets van dat soort ingebouwd heeft.
- voor MySQL, althans volgens de documenten , SOUNDEX is verbroken voor unicode-invoer
Voorbeeld:
SELECT SOUNDEX('Microsoft')
SELECT SOUNDEX('Microsift')
SELECT SOUNDEX('Microsift Corporation')
SELECT SOUNDEX('Microsift Subsidary')
/* all of these return 'M262' */
Voor meer geavanceerde behoeften denk ik dat je moet kijken naar de Levenshtein-afstand (ook wel "edit distance") van twee strings en werk met een drempel. Dit is de complexere (=langzamere) oplossing, maar biedt meer flexibiliteit.
Het grootste nadeel is dat je beide snaren nodig hebt om de afstand ertussen te berekenen. Met SOUNDEX kun je een vooraf berekende SOUNDEX in je tabel opslaan en daarop vergelijken/sorteren/groeperen/filteren. Met de Levenshtein-afstand zou je kunnen ontdekken dat het verschil tussen "Microsoft" en "Nzcrosoft" slechts 2 is, maar het zal veel meer tijd kosten om tot dat resultaat te komen.
In ieder geval is een voorbeeld Levenshtein-afstandsfunctie voor MySQL te vinden op codejanitor.com:Levenshtein-afstand als een in MySQL opgeslagen functie (10 februari 2007) .