Avatar billede alvion Nybegynder
03. februar 2004 - 10:59 Der 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.
Avatar billede detox Nybegynder
03. februar 2004 - 11:17 #1
Måske kunne du stadig bruge: ISO-8859-1 i databasen og så bruge utf8_decode() og utf8_encode() når du laver inserts og viser udtræk.
Avatar billede alvion Nybegynder
03. februar 2004 - 11:22 #2
Mnjaaa... Det duer jo som sagt ikke da:

"Dette site vil henvende sig til firmaer i Østeuropa, mv."

- og f.eks. også Grækenland, Rusland....

ISO-8859-1 kan jo ikke indeholde tegn fra alle disse lande, netop derfor skifter jeg til Unicode.
Avatar billede erikjacobsen Ekspert
03. februar 2004 - 11:23 #3
Avatar billede alvion Nybegynder
03. februar 2004 - 11:36 #4
Hej Erik, jeg sad netop og ventede på dig... ;-)

Ja jeg har også været inde på doc'en omkring Unicode support og ville nok vælge UTF8 til det.

Men... det er jo MySQL 4.1, som endnu ikke er "production stable".

Er det et "no-go" for de ældre versioner?
Avatar billede erikjacobsen Ekspert
03. februar 2004 - 11:44 #5
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.
Avatar billede limemedia Nybegynder
03. februar 2004 - 12:00 #6
Ifølge manualen for LIKE søgninger, noteres dér
Note: Currently LIKE is not multi-byte character safe

hvor unicode jo må siges at være multibyte.
Avatar billede alvion Nybegynder
03. februar 2004 - 12:26 #7
Så er spørgsmålet jo lige, hvad mener MySQL manualen med "Currently..."? Er det 3.23? 4.0? 4.1?
Avatar billede alvion Nybegynder
03. februar 2004 - 12:44 #8
Nåja der er jo kun en ting at gøre: At teste det :-)

Jeg prøver lige at installere MySQL 4.1 og vender så tilbage.
Avatar billede alvion Nybegynder
03. februar 2004 - 13:07 #9
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.
Avatar billede stigc Nybegynder
03. februar 2004 - 13:17 #10
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.
Avatar billede erikjacobsen Ekspert
03. februar 2004 - 13:23 #11
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.
Avatar billede alvion Nybegynder
03. februar 2004 - 13:25 #12
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?
Avatar billede stigc Nybegynder
03. februar 2004 - 13:31 #13
Nur forstår jeg. Kan php ikke arbejde med utf8?
Avatar billede stigc Nybegynder
03. februar 2004 - 13:34 #14
Avatar billede alvion Nybegynder
03. februar 2004 - 13:46 #15
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.
Avatar billede alvion Nybegynder
03. februar 2004 - 13:57 #16
Ok test-results:

Jeg har (i MySQL 4.1) oprettet en tabel med default charachter set = utf8

Så har jeg indsat "SØREN" (SØREN) og søgt på:

SØREN => fundet

s_ren => fundet (beviser at jeg bruger utf8 som characterset, da søgningen ellers kunne ville finde "s__ren")

søren => IKKE FUNDET

Så det var lidt en bet. MySQL's Unicode understøtter ikke pt. case-insensitive searchs ud over det normale engelske alfabet.
Avatar billede limemedia Nybegynder
03. februar 2004 - 13:57 #17
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 ?
Avatar billede alvion Nybegynder
03. februar 2004 - 14:05 #18
Det har jeg jo netop lige fundet ud af, at det er. MySQL's LIKE understøtter IKKE "case insentive search" på unicode felter udover A-Z
Avatar billede alvion Nybegynder
03. februar 2004 - 14:07 #19
Jeg tror jeg skriver min crawler om i php - Python bruger "wide characters" til Unicode og ikke utf8. :-)

Jeg må hellere bruge samme character system begge steder, ellers giver jeg vist mig selv unødige problemer :)
Avatar billede alvion Nybegynder
03. februar 2004 - 21:18 #20
Ok tak for hjælpen.

Stig, Erik og LJ i har alle fortjent at få point så smid et svar (jeg regner ikke med at få et fra dig Erik.... ;-)
Avatar billede limemedia Nybegynder
03. februar 2004 - 21:21 #21
.
Avatar billede erikjacobsen Ekspert
03. februar 2004 - 22:50 #22
nej tak ;)
Avatar billede stigc Nybegynder
04. februar 2004 - 18:00 #23
Jeg samler heller ikke...
Avatar billede alvion Nybegynder
05. februar 2004 - 02:33 #24
Jamen i så fald... :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester