Eller är det bara jag som gör fel...?
Hej!
Jag har stött på ett problem och antar att det är fråga om en bugg i MySQL. Jag har testat både från PhpMyAdmin och egna skript i php med samma förödande effekt.
Ett litet exempl här nedan föreställer en enkel bilddatabas med nyckelord kopplade till olika bilder.
’Column_A’’Column_B’
’Bild_1’ ’[blomma][solros][trädgård]’
’Bild_2’’[bil][volvo][förare]’
’Bild_3’’[högtid][påsk][påsken]’
’Bild_4’’[ljus][sken][stämning]’
För att söka ett ord i Column_B skriver jag Column_B LIKE ’%[söksträng]%’
Jag ska alltså bara få träff där söksträngen ligger mellan hakparenteser i en länge söksträng. Men så är tyvärr inte fallet.
Om jag tex söker ordet ”sken” och skriver LIKE ’%[sken]%’ så får jag inte träff på bara Bild_4. Jag får också träff på Bild_3… Det är ordet ”påsken” som spökar här. Ordet innehåller ju söksträngen men borde inte ge träff eftersom det sökta inte omfamnas av hakparenteser…
Om jag gör några tester till så visar det sig att: om jag söker på ’%[rd]%’ får jag träff på sökordet: trädgård … och %[f]% ger träff på: förare
Efter lite trixande har jag börjat se ett mösnter. Och det är de svenska tecknen å och ö.
-Söksträngen ”%[sken]%” ger träff på ”påsken” därför att det står ett å före sken i påsken…
-Söksträngen ”%[rd]%” ger träff på ”trädgård” – av samma skäl…
-Söksträngen ”%[f]%” ger träff på ”förare” – då det finns ett ö i direkt anslutning efter söksträngen…
SLUTSATS:
Om ett å står före söksträngen i ett ord så ger det en felaktigt men ändock träff.
För ö gäller tvärtom att det råkar stå efter…
Alltså: Om en sökt sträng föregås å eller följs av ett ö får jag en felaktig träff.
Och jag har testat både gemener och versaler med samma trista resultat.
Men det finns en tröst: Jag har försökt men inte lyckats visa något liknande problem med bokstaven ä…
Någon som känner igen denna problematik?
Är det mig eller MySQL som det är fel på?
Bugg i MySQL ???
vad har du för inställning vad det gäller (charset) på db'n, fick problem efter en konvertering av ett svenskt forum från svenskt charset (till) vad det än är för charset för eng.
Testa att byta ut söksträngar med å/ä/ö till
å = å
Å = Å
ä = ä
Ä = Ä
ö = ö
Ö = Ö
i beskrivningen alltså och se till att du har svenskt charset på dbn!
Testa att byta ut söksträngar med å/ä/ö till
å = å
Å = Å
ä = ä
Ä = Ä
ö = ö
Ö = Ö
i beskrivningen alltså och se till att du har svenskt charset på dbn!
Tack för svaret.. Jag har funderat lite i de banorna... Men jag vet inte vad det är för charsetinställningar på DB'n. Den ligger på ett sådant där billighetshotell som inte ger så många rättigheter till avändarna så det är inget jag har någon info om. Har dock mejlat supporten och bett dem titta på problemet. Tror säkert det har med någon c´harsetkonflikt mellan Apache, PHP och MySQL... Det verkar rimligt. Dock är det ju inga problem med hur åäö visas... Allt ser OK ut.
Och felet ligger ju inte i söksträngen heller. den innehåller ju i ovanstående exempel inga svenska tecken.
Problemet är att om ett ord i databasen innehåller söksträngen men inte är söksträngen och att ett å eller ö finns i direkt anslutning till söksträngen i det ordet så resulterar det felaktigt i en sökträff...
Alltså om jag söker efter x (bara x och inget annat än x) och det finns ett åx i databasen så får jag upp åx som en träff... om jag söker efter ordet sken (som i ljussken) så hittar systemet inte bara ordet sken utan även påsken... och påsken vill jag inte hitta...
Och det är de svenska bokstäverna ö och å som spökar till det fast lite olika... å-et måste finnas precis före söksträngen (som i påsken) och ö-et måste finnas precis efter söksträngen...
Jag tror också det har med charset att göra... men jag vet uinte hur. misstänker dock att de svenska tecknen har någonting i sig som tolkas som något slags jokertecken... typ % eller så...
Och felet ligger ju inte i söksträngen heller. den innehåller ju i ovanstående exempel inga svenska tecken.
Problemet är att om ett ord i databasen innehåller söksträngen men inte är söksträngen och att ett å eller ö finns i direkt anslutning till söksträngen i det ordet så resulterar det felaktigt i en sökträff...
Alltså om jag söker efter x (bara x och inget annat än x) och det finns ett åx i databasen så får jag upp åx som en träff... om jag söker efter ordet sken (som i ljussken) så hittar systemet inte bara ordet sken utan även påsken... och påsken vill jag inte hitta...
Och det är de svenska bokstäverna ö och å som spökar till det fast lite olika... å-et måste finnas precis före söksträngen (som i påsken) och ö-et måste finnas precis efter söksträngen...
Jag tror också det har med charset att göra... men jag vet uinte hur. misstänker dock att de svenska tecknen har någonting i sig som tolkas som något slags jokertecken... typ % eller så...
Kan inte svara på varför det blir så för dig, men däremot borde du inte bygga upp databasen på det sättet. LIKE är aldrig effektivt att köra med.
Överväg den här uppsättningen istället:
Tabell 'picture' med binärdatan och en ID-kolumn samt någon metadata kanske.
Tabell 'picture_keyword' med en egen ID-kolumn, nyckelordet och vilket ID i bildtabellen den matchar mot:
Sen om man tar din exempeldata så blir det:
För att sedan hämta ut vilka bilder som matchar exakt mot ordet "påsken":
SELECT p.picture_id, p.picture_data FROM picture p, picture_keyword k WHERE p.picture_id = k.picture_id AND k.keyword = 'påsken'
(Kör du med LIKE här så får du sannolikt samma resultat som du fick förut, men du verkar bara vilja ha exakta resultat och då är den här lösningen bättre.)
Överväg den här uppsättningen istället:
Tabell 'picture' med binärdatan och en ID-kolumn samt någon metadata kanske.
Tabell 'picture_keyword' med en egen ID-kolumn, nyckelordet och vilket ID i bildtabellen den matchar mot:
Code: Select all
CREATE TABLE picture (
picture_id mediumint(8) UNSIGNED NOT NULL AUTO_INCREMENT,
picture_data blob NOT NULL,
PRIMARY KEY (picture_id)
);
CREATE TABLE picture_keyword (
keyword_id mediumint(8) UNSIGNED NOT NULL AUTO_INCREMENT,
keyword varchar(50) NOT NULL,
picture_id mediumint(8) UNSIGNED NOT NULL,
PRIMARY KEY (keyword_id)
);
Code: Select all
picture (picture_id, picture_data)
0, 'binärdata' /* "Bild_1" */
1, 'binärdata' /* "Bild_2" */
2, 'binärdata' /* "Bild_3" */
3, 'binärdata' /* "Bild_4" */
picture_keyword: (keyword_id, keyword, picture_id)
0, 'blomma', 0
1, 'solros', 0
2, 'trädgård', 0
3, 'bil', 1
4, 'volvo', 1
5, 'förare', 1
6, 'högtid', 2
7, 'påsk', 2
8, 'påsken', 2
9, 'ljus', 3
10, 'sken', 3
11, 'stämning', 3
SELECT p.picture_id, p.picture_data FROM picture p, picture_keyword k WHERE p.picture_id = k.picture_id AND k.keyword = 'påsken'
(Kör du med LIKE här så får du sannolikt samma resultat som du fick förut, men du verkar bara vilja ha exakta resultat och då är den här lösningen bättre.)
hej.
Jepp - You're so right!!!
Så ska jag göra... Det löser problemet och blir helt klart bättre.
Men jag är ändå nyfiken på varför det blir så här... Jag antar att det tecknets kod i olika charset är uppbyggd och att det "i tecknet" på något sätt skapas ett slags hakparentes-spöke...
... för det funkar ju precis som att min mysql på något vis tolkar å som en start-hakparentes och ö som en slut-hakparentes...
Men stort TACK för all hjälp. Och att ni knuffat in mig på ett bättre spår avsende uppbyggnaden av databasen... Du vet... Jag är lite riktig råamatör på det här men jag kämpar mig fram med lite ibland egna, lite klumpiga och konstiga lösningar. Det är som med rockenrollen... 3 ackord och fullt ös men inte alltid så genomtänkt och polerat. Men KUL!!!
Så ska jag göra... Det löser problemet och blir helt klart bättre.
Men jag är ändå nyfiken på varför det blir så här... Jag antar att det tecknets kod i olika charset är uppbyggd och att det "i tecknet" på något sätt skapas ett slags hakparentes-spöke...
... för det funkar ju precis som att min mysql på något vis tolkar å som en start-hakparentes och ö som en slut-hakparentes...
Men stort TACK för all hjälp. Och att ni knuffat in mig på ett bättre spår avsende uppbyggnaden av databasen... Du vet... Jag är lite riktig råamatör på det här men jag kämpar mig fram med lite ibland egna, lite klumpiga och konstiga lösningar. Det är som med rockenrollen... 3 ackord och fullt ös men inte alltid så genomtänkt och polerat. Men KUL!!!
Det där låter nästan som SWASCII.Dand wrote:... för det funkar ju precis som att min mysql på något vis tolkar å som en start-hakparentes och ö som en slut-hakparentes...
Bra saker: Lysator, gentoo, smart questions