Hogyan lehet (lehet-e?) PostgreSQL-ben olyan SELECT-et írni, ami az ékezetes betűket ékezettelenként kezeli, tehát az "alom" szóra megtalálja az "álom" szót is?
- 1827 megtekintés
Hozzászólások
elso korben db encoding kerdese szerintem.
t
- A hozzászóláshoz be kell jelentkezni
ILIKE
Tyrael
- A hozzászóláshoz be kell jelentkezni
Ez mysqlben hogy van? Ha van.
- A hozzászóláshoz be kell jelentkezni
nem postgres volt a kerdes?
MySQL-ben nincs, mert ott alapbol ekezet erzeketlen (binary-val lehet kenyszeriteni)
Szoval, mysqlben S ELECT * FROM tabla WHERE mezo = 'tükör' kidobja az osszes rekordot, ahol mezo =
tükör, tükor,tukör,tukor
Ha azt akarod, hogy ne dobja ki, csak ahol egyezik az ekezet:
S ELECT * FROM tabla WHERE binary mezo = 'tükörgo'
postgresen:
S ELECT * FROM tabla WHERE mezo = 'tükör' csak a tükrös talalatokat adja vissza
S ELECT * FROM tabla WHERE mezo ILIKE 'tükör'
...es mire idaig jutottam, eszembe jutott, hogy az ILIKE nem az ekezettelenitest csinalja, hanem a case insensitiveseget. szoval hulyeseget irtam...
de amit irtam az igaz, mysql szarik az ekezetekre, ha nem binaryzol, akkor az ekezet nelkulit is kidobja talalatnak.
viszont googleztam kicsit, van unaccent tarolt eljaras neten, illetve ilyet is irtak:
to_ascii(convert(, 'LATIN2'), 'LATIN2')
ez elmeletileg ekezetteleniti a karaktereket (csak ugye multibytenal ez nem feltetlen a legjobb megoldas)
a tarolt eljarasos(pontosabban fuggveny):
CREATE FUNCTION unaccent(text) RETURNS text AS $$
BEGIN
RETURN translate($1, '\342\347\350\351\352\364\373', 'aceeeou')
; END; $$ LANGUAGE plpgsql IMMUTABLE STRICT;
es ekkor: S ELECT * FROM tabla WHERE unaccent(mezo) == 'tukor';
Bar lehet, hogy nem ilyen egyszeru, mar regen csinaltam ilyesmit.
Tyrael
- A hozzászóláshoz be kell jelentkezni
Köszönöm a segítséget! Elsősorban arra voltam kíváncsi, hogy van-e valamilyen "helyi specialitású" kulcsszó, de a tárolt eljárásos megoldás jónak tűnik.
--------------
Eat healthy,
Exercise daily,
Die anyway.
- A hozzászóláshoz be kell jelentkezni
ez igy ebben a formaban nem igaz, mert ott is van charset.
t
- A hozzászóláshoz be kell jelentkezni
MySQL alapból egyáltalán nem tesz különbséget az ékezetes és ékezet nélkülinél még = esetén se.
mysql> select r from tmp where r='alom';
+-------+
| r |
+-------+
| álom |
| alom |
| Álom |
| Alom |
+-------+
4 rows in set (0.00 sec)
Ha mégis kell, hogy különbséget tegyen, akkor bináris összehasonlítást kell végezni:
mysql> s[b]elect r from tmp where r = binary 'alom';
+------+
| r |
+------+
| alom |
+------+
1 row in set (0.01 sec)
Témához kapcsolódva: PgSQL meg pont fordítva, alapból binárisan hasonlít és csak azt találja meg, ami teljesen egyezik, ott alapból szigorúbban van értelmezve az egyezőség.
(Tábla egyébként egy szimpla varchar(40) típusú mezőt tartalmazott, benne az 'alom','álom','Alom','Álom' rekordok)
- A hozzászóláshoz be kell jelentkezni
ez megint butasag, gondold ujra.
mysql.com/doc, es olvasgasd a charset es collation leirasokat.
t
- A hozzászóláshoz be kell jelentkezni
A tarolt eljarasos megoldas jonak tunik, viszont borzalom lassu es nem indexelheto.
Ha tenyleg fontos az ekezetmentes kereses, es sokszor hasznalod, akkor inkabb insertkor (updatekor) egy triggerrel kepeznem az ekezetmentes tartalmat is, es azt is elmentenem, majd abbol keresnek. Azt korrektul lehet indexelni is.
--
Gabriel Akos
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni