Bugg i MySQL ???

Avdelningen för webbrelaterad programmering och grafisk design.
Post Reply
Dand
Posts: 52
Joined: 2005-04-24 17:23:56
Location: Småland/Stockholm

Bugg i MySQL ???

Post by Dand »

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å?
User avatar
Spixx
Posts: 1613
Joined: 2004-03-20 16:47:34
Contact:

Post by Spixx »

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!
Dand
Posts: 52
Joined: 2005-04-24 17:23:56
Location: Småland/Stockholm

Post by Dand »

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å...
User avatar
linc
Administratör
Posts: 7602
Joined: 2002-02-13 22:22:11
Location: Skåneland
Contact:

Post by linc »

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:

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)
);
Sen om man tar din exempeldata så blir det:

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
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.)
hej.
Dand
Posts: 52
Joined: 2005-04-24 17:23:56
Location: Småland/Stockholm

Post by Dand »

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!!!
User avatar
derfian
Posts: 472
Joined: 2004-02-13 0:18:46
Location: Dorotea / Linköping
Contact:

Post by derfian »

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...
Det där låter nästan som SWASCII.
Post Reply