Soci (Soczó Zsolt) szakmai blogja

2010.05.13.

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 Comments

  1. Én inkább a Hungarian_Technical_CI_AS collation-t használnám…

    Comment by Baazska — 2010.05.13. @ 14:55

  2. Jó ötlet, köszi.

    Comment by Soczó Zsolt — 2010.05.13. @ 15:06

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

    Comment by Lantos Zoltán — 2010.05.17. @ 08:49

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

    Comment by Kovács Zsolt — 2012.04.20. @ 11:34

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress