ugrás a tartalomhoz

MSSQL latin2-es érdekesség

tisch.david · 2008. Nov. 26. (Sze), 10.32
Sziasztok!

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%'
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
SELECT nev FROM tabla WHERE nev LIKE '%NY%'
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
 
1

Latin1_General collation

Rici · 2008. Nov. 26. (Sze), 11.41
Mit értesz az alatt, hogy latin2 adatbázis?

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.)
2

Pedig de. :)

tisch.david · 2008. Nov. 26. (Sze), 12.20
Kedves Rici!

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
3

Továbbra is Latin1_General

Rici · 2008. Nov. 26. (Sze), 16.24
A válasz benn van az előzőben, állítsd át az oszlop collation-ét Latin1_General_CI_AS -re. Vagy ha csak ennél az egyetlen összehasonlításnál kell másként viselkednie az oszlopnak, akkor a lekérdező SQL-ben parancsban használd a COLLATE kifejezést.

(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.)
4

Hogyan?

tisch.david · 2008. Nov. 27. (Cs), 10.49
Kedves Rici!

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
5

SQL WHERE COLLATE

Rici · 2008. Nov. 27. (Cs), 11.07

SELECT nev
FROM tabla
WHERE nev COLLATE Latin1_General_CI_AS LIKE N'%Y%'
Arra figyelj, hogy így biztos nem fog indexet használni a nev oszlopon, bár amúgy is csak akkor használna, ha a LIKE N'Y%' jellegű lenne a keresés, tehát ha csak a postfix tetszőleges, a prefix nem.

É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.
6

Köszönöm a segítségedet!

tisch.david · 2008. Nov. 27. (Cs), 13.25
Kedves Rici!

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
7

Ékezet nem probléma

Rici · 2008. Dec. 1. (H), 18.11
Az ékezetekkel nem lesznek gondok, a collation nevében az AS az Accent Sensitive-re utal, ami azt jelenti, hogy a különböző ékezetes betűk továbbra is különbözőnek számítanak.

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. :)
8

Thx!

tisch.david · 2008. Dec. 3. (Sze), 14.21
Kedves Rici!

Köszi a szakértést! :)
További szép napot:

Dávid