on Oct 30th, 2008MySQL Group by med accent
Edit: bättre lösning i slutet.
I ett projekt är jag tvungen att jämföra olika ord med varandra, ett visst antal gånger.
Logiskt nog använder jag mig utav (simplifierat) SELECT word FROM words GROUP BY word. Idag dök det dock upp problem. Ord som till exempel entré och entre grupperas som samma ord, varför? Jag har faktiskt ingen aning om hur MySQL’s group-funktion jobbar, dock provade jag att ändra teckenkodning till både latin1 och UTF-8, still same problem.
Lösningen för mig blev att köra SELECT word FROM words GROUP BY HEX(word), för att göra en korrekt gruppering.
Jag har gjort lite prestandatester och inte märkt någon prestandaförlust över huvud taget.
När jag får tid kommer jag undersöka detta lite närmare, och ta mig en faktisk titt över hur MySQL hanterar grupperingar.
Finns det en bättre lösning, please enlighten me!
Sjävklart så skall man använda *_bin när man vill jämföra strängar av denna typen. Bin betyder i stort sätt att man jämför strängar binärt, istället för den specifierade teckenkoalitionen.
Prövade du med binära collations (latin1_bin eller utf8_bin)? Collations är ju som bekant det som definierar hur jämförelser mellan strängar sker.
Den stora nackdelen med det där är väl att du förstör alla möjligheter för mysql att indexoptimera frågan. Bortsett från det så är det säkert en så trivial operation att omvandla en sträng till hex att prestandaförlusten blir försumbar.
Herregud, nu får jag allt stå i skamvrån. Jag satt imorse vid fikabordet och sa att det borde fungera med _bin då man som sagt jämför binära värden, och var säker på att jag hade testat detta.
Självklart fungerar det utmärkt, och kommer nu köra med detta. Tack Emil!