Az T-SQL-ben a ' karakterek között adhatunk meg sztringliterálokat (pl: 'Ez egy sztring.'). Ez így persze pongyola, mert az SQL-ben nincs sztring, hanem varchar van (non-unicode), meg nvarchar (unicode).
Itt mindjárt jelentkezik is a pongyola fogalmazás átka: na most akkor melyik?
A válasz: az a'la nature ' karakterek közötti literálok varchar típusúak lesznek, ha nvarchar (unicode) literálra van szükségünk, akkor egy N karakterrel kell prefixelnünk (pl: N'skjønner forstår vær').
Miért fontos ez? Adjuk ki a következő utasítást:
SELECT N'Jóízű félárú sütőtök'
Mi lesz az eredmény? Hát az, hogy Jóízű félárú sütőtök (jó kis kifejezés, benne van az összes magyar ékezetes betű).Most próbáljuk meg N nélkül:
SELECT 'Jóízű félárú sütőtök'
Nos, mi lesz az eredmény? A helyes válasz: fogalmam sincs. Attól függ, hogy az adatbázis, amelyen futtatod, milyen collation-t használ. Ha magyart, akkor helyes lesz az eredmény, ha nem, akkor az adott kódtáblából hiányzó karakterek (minden valószínűség szerint az "ő" meg az "ű") le fognak cserélődni ékezet nélküli párjukra.
Ez akkor tud kellemetlen lenni, ha egy táblánk egy nvarchar típusú mezőjében van valami unicode szöveg, mi pedig egy olyan query-t futtatunk, ami egyezésre, vagy LIKE-kal hasonlóságra vizsgál egy szöveges literálra (pl. egy kézzel írt query az SQL Managerből, vagy egy, az alkalmazásunkból generált query):
SELECT Id, TextValue FROM TestTable WHERE TextValue LIKE '%sütőtök%'Itt, ha nem rakjuk ki az N prefixet, és a adatbázis collation nem magyar, igazából egy LIKE '%sütotök%' fog lefutni, ami nem az, amit mi szeretnénk.

1 megjegyzés:
Szóval ezért vannak ilyen NVarcharos megy NTextes táblák a SN-ben :)
Egyébként más collationnál biztos, hogy van annyira "okos", hogy ö->o, ő->o konverziót csináljon? Nem kerül be valami random karakter?
(Az utolsó példánál pedig szerintem elírtad: LIKE '%sutotok%' fog lefutni, nem? Vagy extrám collation esetén esetleg esetleg '%s?tot?k%' is lehet?)
Megjegyzés küldése