ugrás a tartalomhoz

php-mysql lekérdezésben ékezet probléma

csomi · 2005. Szep. 22. (Cs), 18.12
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!
 
1

Link

halee · 2005. Szep. 23. (P), 09.32
http://dev.mysql.com/doc/mysql/en/string-comparison-functions.html

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
2

majdnem, de mégsem

csomi · 2005. Szep. 23. (P), 19.47
csomi

ööö, 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!
3

collation

Hojtsy Gábor · 2005. Szep. 25. (V), 14.14
A MySQL a használt kódlap és összevetés (collation) alapján dönti el, hogy melyek a 'megegyező' karakterek. Ez arra jó például hogy kis és nagybetűket ne kelljen megkülönböztetni, például Kutya és kutya nyilván ugyanúgy találat lehet. Ha nem akarod ezt a szabados illesztést, akkor neked bináris összevetést kell használnod. A kézikönyvben ezen a környéken tudsz körülnézni a részletek ügyében.
4

gyakorlatban alkalmazni?

csomi · 2005. Okt. 6. (Cs), 22.47
Bocs, hogy ilyen későn reagálok, jött egy "azonnali meló", ezt most tudom folytatni.

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%'";
5

<Nincs cím>

Barkóczi Roland · 2005. Okt. 7. (P), 11.33
SELECT *
FROM `hirek`
WHERE `description` LIKE CONVERT( _utf8 '%$keresoszo%'
USING latin2 ) 
COLLATE latin2_general_ci
6

:(

csomi · 2005. Okt. 9. (V), 14.13
Köszi a gyors választ!
Sajnos nem adja meg magát
<?php
$lekerdezes = "select * from hirek where description LIKE CONVERT( _utf8 '%$keresoszo%' USING latin2 ) or title LIKE CONVERT( _utf8 '%$keresoszo%' USING latin2 ) COLLATE latin2_general_ci";
$eredmeny = mysql_query($lekerdezes);
$sorok_szama = mysql_num_rows($eredmeny);
?>
elszáll a szokásos hibaüzivel. Az eredeti lekérdezéssel megy, valami szintaktikai hiba lehet a bővítés után:((((

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in.......
7

phpmyadmin

Barkóczi Roland · 2005. Okt. 10. (H), 14.15
Szia,

használd a phpMyAdmin 2.6.2-rc1 változat "keresés" menüpontját a szükséges sql szintaxishoz!

Udv: BR
8

<Nincs cím>

csomi · 2005. Okt. 17. (H), 19.33
Köszi a tippet!
Az van, hogy sajna ott sincs megoldás a poblémámra, ergo nem tudom átültetni a lekédezést a gyakolatba.
9

<Nincs cím>

Topi · 2006. Aug. 16. (Sze), 17.14
Nekem is most hasonló problémám akadt! Itt a megoldás, sok szenvedés árán:

SELECT 'alma' LIKE _latin2'%álma' COLLATE latin2_bin;
10

ez :)

KergeKacsa · 2006. Aug. 16. (Sze), 18.22
Nekem nem igazán müködött ez (a php myadmin keresése sem), viszont ez müxik:

SELECT *
FROM tábla
WHERE BINARY title LIKE '%í%'
11

2008

mirc · 2008. Feb. 20. (Sze), 05.10
Belefutottam most ebbe a problemaba, marminthogy a "trukk" szora nem dobott olyan talalatokat, amik a "trükk" szot tartalmaztak.
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)
12

mysql v3.23

Johnny · 2008. Már. 8. (Szo), 22.43
Sziasztok!

Meg tudja valaki mondani, hogy mysql 3.23-nál miért nem jeleníti meg az ékezetes találatokat?

pl.

...like '%al%'...
Egy ilyen lekérdezésnél megjelennek az hal, alajos szavak, de nem jelenik meg mondjuk a háló szó találatként. Magasabb verziójú sql-nél működik a dolog, de sajnos azon a szerveren, ahol ezt használnom kéne ott 3.23 van és egyelőre esély sincs verzióváltásra.

Köszi!