php-mysql lekérdezésben ékezet probléma
Sziasztok!
A következő problémám van. Mysql táblából keresek keresőszó
alapján. A táblában ékezetesek a karakterek, kiíratásnál és a phpMyadmiban úgy is jelennek meg. Eddig szuper. A keres.php-ben a user
beír egy ékezetes keresőszót, erre a találatok közt szerepelnek azok
a kereszőszónak megfelelő rekordok is, amelyek nem ékezetesek.
Pl.: élek keresőszóra kigyűjti az ELek-et tartalamzó rekord mezőket
is és fordítva.
select * from hirek where description like $keresoszo order by
idopont....
Köszi a segítséget!
■ A következő problémám van. Mysql táblából keresek keresőszó
alapján. A táblában ékezetesek a karakterek, kiíratásnál és a phpMyadmiban úgy is jelennek meg. Eddig szuper. A keres.php-ben a user
beír egy ékezetes keresőszót, erre a találatok közt szerepelnek azok
a kereszőszónak megfelelő rekordok is, amelyek nem ékezetesek.
Pl.: élek keresőszóra kigyűjti az ELek-et tartalamzó rekord mezőket
is és fordítva.
select * from hirek where description like $keresoszo order by
idopont....
Köszi a segítséget!
Link
Itt utánna tudsz nézni, ha jól emlékszem, akkor erre a célra az strcmp(); függvény is használható.
üdv
majdnem, de mégsem
ööö, a strcmp() azt hiszem nem segít, de a megoldás közelébe vezettél a linkkel.
CSak az a baj, hogy nem tudom átültetni a gyakolatba. Az alábbi linknél lehet a megoldás, vagy mi...
http://dev.mysql.com/doc/mysql/en/charset-literal.html
Examples:
SELECT 'string';
SELECT _latin2'string';
SELECT _latin2'string' COLLATE latin2_danish_ci; // itt persze nem a danish, hanem valami hungaian lehet jó
és ezt a lekédezést kellene átalakítani, a fenti példák alapján, de nem tudom hogyan:
$lekerdezes = "select * from hirek where description LIKE '%$keresoszo%' and kategoria='$kategoria'";
HELP valaki pls!
collation
gyakorlatban alkalmazni?
Szóval valamit a "collate"-tal kellene kavarni, csak nem tudom átültetni a gyakorlatba.
Mit és hová írjak ebbe a lekédezésbe, hogy működjön is? Akárhogy variáltam a "collate"-tal bővített lekédezést, elszállt a mysql hibaüzivel.
Ha valaki át tudná írni az alábbi lekérdezést, úgy hogy az orbán-ra ne hozza ki az ékezet nélküli találatokat, mint (s)orban, és fordítva se, azt nagyon megköszönném!
Azt hiszem ezt a charsetet kellene használni: latin2_general_ci. De hogyan is?
$lekerdezes = "select * from hirek where description LIKE '%$keresoszo%' or title LIKE '%$keresoszo%'";
<Nincs cím>
:(
Sajnos nem adja meg magát
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in.......
phpmyadmin
használd a phpMyAdmin 2.6.2-rc1 változat "keresés" menüpontját a szükséges sql szintaxishoz!
Udv: BR
<Nincs cím>
Az van, hogy sajna ott sincs megoldás a poblémámra, ergo nem tudom átültetni a lekédezést a gyakolatba.
<Nincs cím>
SELECT 'alma' LIKE _latin2'%álma' COLLATE latin2_bin;
ez :)
SELECT *
FROM tábla
WHERE BINARY title LIKE '%í%'
2008
A megoldas mysql 5 eseten, mert ez a 4-esben meg siman ment mindenfele izelgetes nelkul:
-Az egesz adatbazis latin2_hungarian_ci COLLATION-el lett letrehozva. (ez nem feltétel, csak nalam igy volt)
-Az adott table-ben a mezo termeszetesen olyan tipusu kell legyen ami case-insensitive pl: VARCHAR, TEXT
-A mezo COLLATION-jet pedig a eredeti latin2_hungarian_ci-rol atallitottam latin2_general_ci -re es hirtelen elkezdett mukodni a dolog :D
Valahol logikus is, mert a COLLATION hatarozza meg azt a szabalyrendszert, ami alapjan pl rendezi abc szerint a szoveget a mysql. Ugy tunik a latin2_hungarian_ci szigoruan kulonbseget tesz az "u" illetve az "ü" betuk kozott, ami abszolute helyes, csak esetunkben ugye ez nem jó :D
Igy utolag belegondolva az egeszet el lehetett volna intezni fuggvenykezelesse is:
SELECT * FROM barmi WHERE mezonev LIKE _latin2"%trukk%" COLLATE latin2_general_ci;
A problema viszont az, hogy ez meg visszafelé már nem jó. Ez nem mukodik, nem ad vissza eredmenyt:
SELECT * FROM barmi WHERE mezonev LIKE _latin2"%trükk%" COLLATE latin2_general_ci;
Marad tehat az a megoldas, hogy a mezo COLLATION-jet allitjuk at latin2_general_ci -re. Ez mindkett esettel mukodik:
SELECT * FROM barmi WHERE mezonev LIKE "%trukk%";
SELECT * FROM barmi WHERE mezonev LIKE "%trükk%";
Viszont azzal együtt kell élni, hogy ugyanazt fogja visszaadni eredményül mindkettő. Magyarán az ekezett nelkuli visszadja az ékezetest is, de az ékezetes is visszaadja a ékezet nélkülieket.
Ha mégis csak az egyik kellene, akkor meg ott a már említett LIKE BINARY megoldás, vagy lehet használni a latin2_bin-t is, ami case-sensitive a nevebol is adodoan (bin=binary)
u.i:
A mysql kapcsolat charset-jet barmikor at lehet allitani (csak mert alapesetben olyan, amit konfignal megadtak, alapbol utf-8):
SET CHARACTER SET latin2
SET NAMES latin2
(a ketto kb egyebkent ugyanazt csinalja)
mysql v3.23
Meg tudja valaki mondani, hogy mysql 3.23-nál miért nem jeleníti meg az ékezetes találatokat?
pl.
Köszi!