Kolacije (Collation)
Objavljeno: 27-02-2014 | Autor: Miloš Milenković | Kategorija: T-SQL
Ознаке: collation
0
Kolacija se može definisati kao skup pravila koji određuje kako se neki karakter ponaša u određenom jeziku. Najznačajni uticaj ima na sortiranje i poređenje karaktera. U principu, svaki jezik ima svoju kolaciju, koja može biti slična ili čak identična nekoj drugoj. Preko kolacije se definiše osetljivost na veličinu slova, oznake akcenta, tipove kana karaktera i širinu karaktera.
- Osetljivost na veličinu slova: Ukoliko je podešena osetljivost na veličinu slova, SQL Server će različito tretirati A i a, B i b itd., zbog toga što je ASCII vrednost ovih karaktera različita. Ukoliko nije uključena osetljivost na veličinu slova, navedeni parovi karaktera će biti jednaki za SQL Server.
- Osetljivost na oznake akcenta: Ukoliko je uključena osetljivost na oznake akcenta, SQL Server će različito tretirati a i á, o i ó itd. U suprotnom, navedeni parovi karaktera će se prilikom poređenja i sortiranja smatrati jednakim. Ovo je posebno važno kada radimo sa jezicima koji imaju ovakve znakove u pismu.
- Osetljivost na tipove kana karaktera je specifična za japanski jezik. Ukoliko je uključena, Hiragana and Katakana karakteri će se tretirati kao različiti, u suprotnom kao jednaki.
- Osetljivost na širinu karaktera se odnosi na veličinu karaktera u bajtovima. Ukoliko je uključena, dva ista karaktera od kojih je zbog različitih tipova podataka jedan veličine jednog bajta, a drugi veličine dva bajta će se smatratiti različitim, a u suprotnom jednakim.
Podrazumevana kolacija prilikom instalacije SQL Servera zavisi od lokalnih podešavanja Windowsa. Najčešće je to Latin1_General_CI_AS, pa ćemo ovu kolaciju iskoristiti da objasnimo prethodno opisana svojstva.
- CI se odnosi na osetljivost na veličinu slova i označava Case Insensitive (neosetljiv na veličinu slova). Ukoliko bismo želeli da uključimo osteljivost promenili bismo kolaciju u Latin1_General_CS_AS.
- AS se odnosi na osetljivost na oznake akcenta i označava Accent Sensitive (osetljiv na oznake akcenta). Ukoliko bismo želeli da isključimo osteljivost promenili bismo kolaciju u Latin1_General_CI_AI.
- Pošto je osetljivost na tipove kana karaktera specifična za japanski jezik, retko se sreće u nazivima kolacija. Ukoliko želimo da je uključimo, na naziv kolacije dodajemo KS što označava Kana Sensitive (osetljiv na tipove kana karaktera). U tom slučaju bi kolacija bila Latin1_General_CI_AS_KS.
- Osetljivost na širinu karaktera takođe nije nešto što se često sreće u nazivima kolacija. Ukoliko želimo da je uključimo, na naziv kolacije dodajemo WS što označava Width Sensitive (osetljiv na širinu karaktera). U tom slučaju bi kolacija bila Latin1_General_CI_AS_WS.
Pored pomenute kolacije, neke od najčešće korišćenih na našim prostorima su: Slovenian_CI_AS, Croatian_CI_AS, Macedonian_FYROM_90_CI_AS itd.
Kolacija se može postaviti na 3 nivoa:
- Nivo servera: bira se prilikom instalacije i nasleđuju je sve nove baze na serveru ukoliko se prilikom kreiranja baze ne naglasi drugačije.
- Nivo baze: podešava se prilikom kreiranja baze, a ukoliko se ne naglasi nasleđuje se kolacija servera.
- Nivo kolone: podešava se prilikom kreiranja tabele tako što se za svaku kolonu može naznačiti željena kolacija, a ukoliko se ne naglasi nasleđuje se kolacija baze.
Važno je naglasiti da ukoliko se nakon nekog vremena promeni kolacija na nivou servera ili baze to se neće retroaktivno odraziti na već kreirane objekte, već samo na objekte koji se kreiraju nakon promene.
Najčešći problem koji se javlja kao posledica različitih kolacija na nekim kolonama je nemogućnost poređenja dve takve kolone ili spajanja po takvim kolonama. Ukoliko pokušamo da uradimo JOIN po dve kolone koje imaju različitu kolaciju, dobićemo grešku:
Cannot resolve collation conflict for equal to operation.
Najjednostavnije rešenje u ovom slučaju je da navedemo kolaciju koju želimo da koristimo uz pomoć klauzule COLLATE. Ukoliko želimo, možemo da specificiramo tačan naziv kolacije, na primer:
COLLATE Latin1_General_CI_AS
Ukoliko nemamo posebnih želja, možemo jednostavno napisati:
COLLATE DATABASE_DEFAULT
čime ćemo navesti SQL Server da koristi podrazumevanu kolaciju baze na koju smo konektovani.
Evo i celog primera, u slučaju da kolone Naziv1 i Naziv2 imaju različitu kolaciju:
SELECT t1.* FROM table1 t1 JOIN table2 t2 on t1.Naziv = t2.Naziv COLLATE DATABASE_DEFAULT;
Na kraju, treba napomenuti da COLLATE klauzula može značajno da utiče na performanse upita, budući da ona implicira sortiranje vrednosti kolone kako bi se omogućilo poređenje sa drugom kolonom. Ukoliko je moguće treba izbegavati korišćenje ove klauzule, a najbolje rešenje je prilagoditi kolaciju u samoj bazi. Na žalost, u nekim slučajevima ovo nije moguće, pa je COLLATE jedino rešenje.