Du kan börja med att använda SOUNDEX()
, detta kommer förmodligen att räcka till vad du behöver (jag ser en ruta med automatiska förslag med redan existerande alternativ för vad användaren skriver).
Nackdelarna med SOUNDEX()
är:
- dess oförmåga att särskilja längre strängar. Endast de första tecknen tas med i beräkningen, längre strängar som divergerar i slutet genererar samma SOUNDEX-värde
- det faktum att den första bokstaven måste vara densamma annars hittar du inte en matchning lätt. SQL Server har DIFFERENCE()-funktionen för att berätta hur mycket två SOUNDEX-värden skiljer sig åt, men jag tror att MySQL inte har något sådant inbyggt.
- för MySQL, åtminstone enligt den dokument , SOUNDEX är trasigt för unicode-ingång
Exempel:
SELECT SOUNDEX('Microsoft')
SELECT SOUNDEX('Microsift')
SELECT SOUNDEX('Microsift Corporation')
SELECT SOUNDEX('Microsift Subsidary')
/* all of these return 'M262' */
För mer avancerade behov tror jag att du måste titta på Levenshtein-avståndet (även kallat "redigera avstånd") av två strängar och arbeta med en tröskel. Detta är den mer komplexa (=långsammare) lösningen, men den möjliggör större flexibilitet.
Den största nackdelen är att du behöver båda strängarna för att beräkna avståndet mellan dem. Med SOUNDEX kan du lagra ett förberäknat SOUNDEX i din tabell och jämföra/sortera/gruppera/filtrera på det. Med Levenshtein-distansen kanske du upptäcker att skillnaden mellan "Microsoft" och "Nzcrosoft" bara är 2, men det kommer att ta mycket mer tid att komma till det resultatet.
I vilket fall som helst kan ett exempel på Levenshtein-distansfunktion för MySQL hittas på codejanitor.com:Levenshtein Distance som en MySQL-lagrad funktion (10 februari 2007) .