ugrás a tartalomhoz

MySQL SELECT parancs LIKE feltétellel

zvaranka · 2004. Júl. 18. (V), 15.26
Sziasztok.

Van egy problémám a MySQL lekérdezéssel kapcsolatban.

Ha a SELECT mezo FROM adatbazis WHERE mezo LIKE 'A%' lekérdezést futtatom, akkor a rendszer visszaadja az A-val és az Á-val kezdődő mezőtartalmakat is, holott csak az A-val kezdődőeket kellene visszadnia. Van valakinek valamilyen ötlete? Szerintem a MySQL konfigurációban kellene valamit beállítani, de nem vagyok biztos benne. Előre is köszönöm az ötleteket...

Zoli
 
1

binary

Hodicska Gergely · 2004. Júl. 19. (H), 13.26
Szia!

a rendszer visszaadja az A-val és az Á-val kezdődő mezőtartalmakat is
Tabla definiciot tudsz mutatni? Nem lehet, hogy az a mezo binary-val van definialva?

Felho
2

Tábladefinició

zvaranka · 2004. Júl. 19. (H), 16.52
Szia!

Egy térképészeti témájú alkalmazást írok, amelyben többek között településeket lehet kiválasztani kezdőbetű alapján. A kezdőbetűt egy listában sorolom fel (A, Á, B, ...)

A megfelelő tábladefinició a következő, varchar-t használok a szöveg alapú adatokhoz:

CREATE TABLE settlements (
settlement varchar(30) NOT NULL default '',
county varchar(30) NOT NULL default '',
geoh double NOT NULL default '0',
geov double NOT NULL default '0',
PRIMARY KEY (settlement),
UNIQUE KEY settlement (settlement)
) TYPE=MyISAM;

Egy php fájlban a lekérdezést így valósítom meg:

A $letter nev nevű változóba érkezik a kezdőbetű. Figyelem továbbá, hogy a C-nél ne kapjunk vissza Cs-vel kezdődőeket, stb.

...
$letter = $_POST["letter"];
$exletter = "";
switch ($letter) {
case "C":
$exletter = "Cs";
break;
case "Cs":
$exletter = "C";
break;
case "G":
$exletter = "Gy";
break;
case "Gy":
$exletter = "G";
break;
case "L":
$exletter = "Ly";
break;
case "Ly":
$exletter = "L";
break;
case "N":
$exletter = "Ny";
break;
case "Ny":
$exletter = "N";
break;
case "S":
$exletter = "Sz";
break;
case "Sz":
$exletter = "S";
break;
case "T":
$exletter = "Ty";
break;
case "Ty":
$exletter = "T";
break;
case "Z":
$exletter = "Zs";
break;
case "Zs":
$exletter = "Z";
break;
default:
$exletter = "";
}
// lekerdezoparancs
$getsettlementlistcommand = "SELECT settlement, geoh, geov FROM settlements WHERE settlement LIKE '$letter%'";
if ($exletter != "") {
$getsettlementlistcommand .= " AND settlement NOT LIKE '$exletter%'";
}
...

Az alkalmazás egyenlőre csak teszt jelleggel fut, 1 : 50 000 méretarányú térképekre. Így nem minden funkció működik még a keresésben.

http://www.topomap.hu/mapnavigator/hun/mapnavigator.html

Elképzelhető, hogy a MySQL-ben kell valamit beállítani?

Köszi a segítséget...
Zoli
--------------
Varanka Zoltán
www.novolibro.hu/novolortal
--------------
3

Szerintem utf kódolást hasz

Balogh Tibor · 2004. Júl. 20. (K), 08.54
Szerintem utf kódolást használsz, ezért adja vissza az Á betűt (2 bájt) az A betűvel együtt.
4

UTF kódolás

zvaranka · 2004. Júl. 20. (K), 10.12
Köszi az ötletet, meg tudnád mondani, mit kell beállítani ahhoz, hogy helyes eredményt kapjak?
--------------
Varanka Zoltán
www.novolibro.hu/novoportal
--------------
9

UTF kódolás

Balogh Tibor · 2004. Júl. 24. (Szo), 10.53
A MySql a 4.1 változattól támogatja a unicode karaktertáblát, be lehet állítani az adatbázis, a tábla vagy a mező kódolási formáját unicode formátumra, de a 4.1 sorozat még nem stabil, a 4.0.xx pedig nem tartalmaz ilyen támogatást.
Esetleg kiíratásnál csinálj egy szűrést. Megvban az adatbázisból visszakapott eredményed, és csak azokat a sorokat iratod ki, amelyik neked tetszetősek. Mondjuk leválasztod az első karaktert, és erre csinálsz egy ellenőrzést, de vigyázz, hogy utf-8 kódolásnál egy karakter több bájtból is állhat. De lehet, hogy egy egyszerű < viszgálat is megteszi, és nem kell bajlódni az első karakter leválasztásával.
Ha unicode kódolással tárolod a karaktereket a MySql 4.0.xx adatbázisban, akkor a mezőt állítsd BINARY-ra, egyébként a tábla javításánál, optimalizációjánál elbarmolja a karaktereket.

balti
10

Köszönöm az ötletet! Szer

zvaranka · 2004. Júl. 25. (V), 09.20
Köszönöm az ötletet! Szerintem a végleges unicode kezeléséig a kiíráskori szűrés megfelelő megoldás lesz.
--------------
Varanka Zoltán
www.novolibro.hu/novoportal
--------------
5

Nekem igy mukodik jol

Til · 2004. Júl. 20. (K), 14.47
CREATE TABLE `teszt` (
  `aaa` varchar(10) binary NOT NULL default ''
)

Próbáld ki, mi bajod lehet :)
6

Mégse

Til · 2004. Júl. 20. (K), 14.53
Ok, elhamarkodtam, mégsem jó így...
7

Köszi a választ, mindenkép

zvaranka · 2004. Júl. 21. (Sze), 07.27
Köszi a választ, mindenképpen varchar-ban szeretném tárolni az adatokat, nekem úgy tűnik mintha a MySQL csak az első 127 karaktert használná illetőleg a legfelső bitet törölné és az alapján keresne. Lehet, hogy a karakterkészlettel van probléma. Próbálkozom én is...
--------------
Varanka Zoltán
www.novolibro.hu/novoportal
--------------
8

rtfm rulz

Török Gábor · 2004. Júl. 22. (Cs), 08.40
http://dev.mysql.com/doc/mysql/en/CHAR.html

--
slink
11

Nem a kódolásról van szó

Anonymous · 2005. Jan. 1. (Szo), 07.36
A LIKE az ékezetekre is illeszkedik, használj reguláris kifejezéseket.