MSSQL latin2-es érdekesség
Sziasztok!
Az alábbi érdekességbe futottam bele MSSQL szerver 2005-nél, egy latin2-es adatbázisnál:
Adott a következő select:Ez a lekérdezés nem adja vissza azt a sort, melyben a név Andocs 22 NY. Ha a keresést NY-re módosítom akkor visszaadja ezt a sort is. Ugyanez a helyzet a többi magyar kettős mássalhangzóval is.
Lehet, hogy ez normális, engem mindenesetre meglepett, és érdekelne, hogy vajon milyen megoldások léteznek az általam elvárt viselkedés kikényszerítésére?
Előre is köszi a válaszokat!
Üdv:
Dávid
■ Az alábbi érdekességbe futottam bele MSSQL szerver 2005-nél, egy latin2-es adatbázisnál:
Adott a következő select:
SELECT nev FROM tabla WHERE nev LIKE '%Y%'
SELECT nev FROM tabla WHERE nev LIKE '%NY%'
Lehet, hogy ez normális, engem mindenesetre meglepett, és érdekelne, hogy vajon milyen megoldások léteznek az általam elvárt viselkedés kikényszerítésére?
Előre is köszi a válaszokat!
Üdv:
Dávid
Latin1_General collation
MS SQL-nél oszlop szinten adhatod meg, hogy egybájtos (varchar), vagy kétbájtos (nvarchar) tárolás legyen. A részletek mellőzve csak annyit mondanék, hogy mindenképp nvarchar típust érdemes használni.
Egy ettől nagyjából független dolog, hogy a tárolt adatokat hogy szeretnéd összahasonlítani és rendezni, ez a collation. Ez pedig megadható szerver, adatbázis és oszlop szinten.
Ha nem akarod, hogy a magyar betűk szerint hasonlítson, akkor a Latin1_General collation-t érdemes használni, ez az angolnak felel meg. (Latin2 collation nincs, az összes többi collation nevében pedig egy nyelv szerepel, szóval ezért kétlem, hogy neked latin2 adatbázisod van.)
Pedig de. :)
Hozzászólásomban valóban az általam jobban ismert MySQL terminológiájátt használtam, de a helyzet mégiscsak az, hogy van egy adott, Hungarian_CI_AS collation-nel rendelkező adatbázis, és egy nvarchar(50)-es, adatbázis collation-t használó NEV mező, melyben keresnem kéne szótöredékre, méghozzá oly módon, hogy Y-ra keresve az NY-et tartalmazó sorokat is visszakapjam.
A feladatot így pontosítva van valami ötleted?
Köszi és üdv:
Dávid
Továbbra is Latin1_General
(Amúgy az általad leírtaktól még nem Latin2-es az oszlopod. Ha MySQL terminológiát használnánk, akkor inkább ucs2_hungarian_ci -nek lehetne nevezni. Ugyanis az nvarchar az UCS-2 kódolást jelent.)
Hogyan?
Az oszlop collation-jét nem lehet átállítani, mert az adatbázist nem én felügyelem. (Ezért is tettem fel a kérdést. :) )
Utánanéztem második ötletednek, és az MSSQL doksijában azt találtam, hogy a COLLATE-et az ORDER BY záradékban kell használni, ami viszont nyilván nem oldja meg a problémámat.
Ha lehet a COLLATE-et a WHERE-ben is használni, tudnál erre egy egyszerű példát mutatni? Vagy van valami egyéb ötleted?
Köszi:
Dávid
SQL WHERE COLLATE
És arra is figyelj, hogyha sztring konstansokat használsz, tedd ki a elé az N karaktert, mert így lesz a konstans nvarchar típusú. Persze jó esetben paraméterben adod át a sztringet, és nem sztringösszefűzéssel, ekkor a providertől függ, hogy pontosan hogyan is kezeli ezt a kérdést.
Köszönöm a segítségedet!
Köszönöm a segítségedet! Így most valóban azt csinálja, amit elvártam tőle eredetileg is.
2 dolgot kérdeznék még Tőled:
- Az, hogy latin1 szerint rendezünk a keresésben, nem fog visszaütni, ha latin2-es ékezeteket tartalmazó szövegrészletre keresek?
- Tudnál esetleg egy jól használható, online MSSQL doksit ajánlani? A TechNet-es, Microsoft-os doksival nem vagyok kibékülve.
Köszi:
Dávid
Ékezet nem probléma
A technetesen kívül más komplett, nagy méretű doksit nem olvastam, szerintem az jól használható. Azt érdemes tudni, mint általában az összes Microsoft helpnél és doksinál, hogy általában két nagy részre vannak osztva, az egyik a koncepciókat és a működés elvét írja le, a másik meg a konkrét használatot (pl. SQL utasítások). Ezért ha valami konkrét kérdésre keresel választ, nem árt előtte elolvasni a koncepciókat, utána meg a referenciában a konkrét szintaxist.
És persze a konkrét kérdéseknél a Google is gyakran sokat segít. :)
Thx!
Köszi a szakértést! :)
További szép napot:
Dávid