Szótöredék keresés SQL Serveren – furcsának ható hiba

Az alábbi kérdezték tőlem pár perce:

SELECT   FROM [table1] WHERE  like '%rekes%'

A rekesz szót nem találja meg, ha magyar a collation az oszlopon. Ez természetes, a kettős betűket ezzel a logikával kezeli a szerver, azaz egy betűnek tekinti őket. A where-be kell egy collation cast, mondjuk latin1-re, amiben nincsenek kettős betűk. Mondjuk ezután nem fog indexet használni a szerver, de a kezdő % miatt eleve nem használva.
Az alábbi példában az egyikkel collationnel megtalálja, másikkal nem.

SELECT   FROM [table1] WHERE  like '%rekes%'
--  collate Hungarian_CI_AS
collate Latin1_General_CI_AS

Lehet csinálni indexelt, számított oszlopot is más collationnel, és arra szűrni, az gyorsabb lesz.

4 thoughts on “Szótöredék keresés SQL Serveren – furcsának ható hiba

  1. Lantos Zoltán

    Érdemes az egész adatbázist átrakni Hungarian_Technical_CI_AS-be vagy a fenti példa is megteszi?
    Van más eltérés is a technical-ban? pl.: rendezésnél vagy az ékezetes karakterek keresésénél?

    thx.

  2. Kovács Zsolt

    Collation-al kapcsolatban még egy dolgot én is megjegyznék :)
    Egyszer találkoztam azzal a hibával, hogy az oszlop neve kettős betűt tartalmazott, de nagyon okosan így írták: “MisZol”.
    A collation “SQL_Hungarian_CP1250_CI_AS” volt és csak úgy fogadta el az oszlopnevet, ha a “z” nagy “Z”-nek volt írva a query-ben, egyébként hibát dobott, hogy nem létező oszlop.
    A megoldás a Technical collation vagy az oszlop átnevezése (amelyik szimpatikusabb) volt.

Comments are closed.