PostgreSQL ékezet-érzéketlenség?

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?

Hozzászólások

elso korben db encoding kerdese szerintem.

t

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

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 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