03. februar 2004 - 10:59Der er
23 kommentarer og 1 løsning
unicode, LIKE og forskel imellem store og små bogstaver
Jeg er nået til et punkt, hvor et website skal arbejde i Unicode istedet for ISO-8859-1. Det vil bla. betyde, at jeg konverterer alle tekstdata i min MySQL database til Unicode - det er ikke noget problem.
Mit problem består i følgende:
Konverteringen af f.eks. de danske tegn er: æ = æ ø = ø å = Ã¥ Æ = Æ Ø = Ø Å = Ã…
Dvs. jeg f.eks. et felt med teksten "søren", vil denne blive konverteret til "søren".
Mit problem kommer så der, hvor jeg vil søge med LIKE, som jo NORMALT kan skelne imellem store og små bogstaver.
Vil jeg søge på SØREN, bliver det til
"... where mitfelt LIKE 'SØREN' ..."
Det vil jo så ikke finde "søren"
Hvad skal jeg gøre? Eksemplet er jo kun danske tegn, men der kommer flere. Dette site vil henvende sig til firmaer i Østeuropa, mv.
Ikke nødvendigvis, men du skal kode dig ud af det. Du kan fx lave et ekstra felt: `uppercasename` som indholder samme information som `name`, og som opdateres parallelt. Så søger du på det felt efter have sat søgeteksten i uppercase.
Sortering kan måske også ske på det felt - ellers kan du kode dig ud af det tilsvarende.
Når du kan bruge MySql 4.x, x>=1, er det nemt at rette til igen.
Mens jeg compiler, fik jeg en tanke på baggrund af det, du sagde Erik...
Findes der php funktioner til at konvertere utf8 strenge til f.eks. uppercase? Og har begrebet "uppercase" overhovedet en betydning på f.eks. russisk? Hebrærisk?
Er det egentlig ikke lige så meget et spørgsmål om at "e" og "é" matche det samme?
Jeg har været inde på www.unicode.org for at se, om der er lavet sådanne "konverteringstabeller" (eller skulle man kalde dem "tabeller af sammenhænge imellem utf8 tegn"...), men jeg kunne ikke finde noget.
Det vil jo være fuldstændigt umuligt for mig at skabe sådanne tabeller selv.
Jeg har lige siddet og læst lidt. Det er vel ikke nogen problemer i at du har et alm. ISO-8859-1 felt, hvori du altid gemmer teksten som lowercase. En like søgning i dette felt med utf-8 input, konverteret til ISO-8859-1 og lowercaset vil vel virke.
Jeg ved det ikke ... det kommer an på en prøve. Men kan du ikke automatiks konvertere til upper/lowercase med indbyggede funktioner, må du jo skrive een selv. Der er store og små bogstaver på både russisk og græsk.
stigc -> Det er rigtigt, men så er vi tilbage til spørgmålet med konverteringen fra utf8 til ISO-8859-1 i "lowercase". Hvordan sikrer jeg at "SØREN" bliver konverteret til "søren" (ø = lille ø) og ikke "sØren" (Ø = stort Ø).
Kort sagt: Findes der en fornuftig konverteringstabel til f.eks. Python og PHP?
Se nu begynder vi jo at nærme os noget brugbart :-)
Alle mine LIKE søgninger sker i forvejen i en særskilt "ord-tabel", som jeg opdaterer via en selvstændig "site-crawler" (som jeg har kodet i Python). Jeg vil undersøge, om Python har en lignende mulighed for at lave lowercase konvertering (er meget sandsynligt).
ord-tabellen bruges udelukkende til søgning, ikke til præsentation. Så det passer mig fint at jeg kan lowercase'e alle tekster.
med mindre du angiver BINARY foran mindst ét af dine argumenter, vil din like søgning være "case insensitiv" - så er det nødvendigt med at konvertere til lowercase når alt kommer til alt ?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.