MS SQL: Da li je razmak punopravan znak?
Wednesday, 09.09.2009 – ZidarSvi SQL sistemi i programski jezici imaju funkciju za izracunavanje duzine stringa. U MS SQL tu ulogu ima funkcija LEN. Valjda i najveci pocetnik zna da izvrsi ovo:
SELECT LEN('abc')
i dobije rezultat 3. Hajde da prosirimo string ‘abc’, ovako:
SELECT LEN('abc x')
Rezultat je 12. Ako odbacimo ‘x’ na kraju, ja bih ocekivao da dobijem duzimu 11. I razmaci su karakteri, inace bi ih funkcija LEN zanemarila u prethodnom primeru, zar ne? Pokusajmo dakle ovo:
SELECT LEN('abc ')
Ooops, rezultat je 3. A ocekivali smo 11. Trk u Books On line, da vidimo sta pise, kad ono – nista. Nema ni pomena da se LEN ovako ponasa. OK, mozad se to smatra za opste poznatu stvar, jer u nekim drugim sistemima se LEN ponasa slicno. Ja doduse ne poznajem druge sistem toliko detljno. Jedini database sistem koji poznajem bolje nego MS SQL je Access. I gle cuda, u Accesu LEN ne zanemaruje razmake na kraju stringa.
Dobro, prihvatimo realnost, MS SQL zanemaruje razmake na kraju stringa u funkciji LEN. Kako onda da dobijem, pravu duzinu stringa? Moze na vise nacina. Nacin prvi: dodati neki znak na string kome racunamo duzinu, pa od rezultat oduzeti 1. Ovako nekako:
SELECT LEN('abc '+'X') - 1
Radi. Vraca rezultat 11. Lepo, ali ko ce se toga setiti bas svaki put…. Zato postoji diraktan nacin – upotreba funkcije DATALENGTH. Nisam siguran da je ova funkcija po SQL standardu, ali nema veze, vrsi posao:
SELECT DATALENGTH('abc ')
Dobili smo tacan rezultat – 11. Ipak, pre nego sto u glavi zacrtamo ‘Ne koristi LEN nikada, umesto LEN koristi DATALENGTH, i nemaj drugog Boga osim toga’, razumno je pretpostaviti da je DATLENGTH skuplja za izvrsavanje nego LEN, sto u nekim kverijima moze biti od znacaja.
O, i jos jedna stvar na kraju. Razmaci na pocetku stringa se uzimaju u obzir, LEN ih ne zanemaruje. Ko zeli, moze da proba i uveri se sam.
Naravoucenije: za MS SQL razmak je gradjanin nizeg reda, pa se ponekad zanemaruje. Medjutim, kao i svuda, ako s egradjanin nizeg reda postavi na neku vodecu poziciju, sitem pocinje da ga uvazava. MS Access je znaci vise naklonjen univerzalnoj jendakosti, bar kad je funkcija LEN u pitanju, pa razmake tretira kao i sve druge znakove, bez zizuzetka, bez obzira na poziciju.
Kad je MICROSFT u pitnju sve je moguce.
🙂
2 Responses to “MS SQL: Da li je razmak punopravan znak?”
Da… stvarno čudno ponašanje funkcije LEN s obzirom da se ovdje radi o stringu. Znak je znak makar se radilo o razmaku – jer ne može biti isto ‘abc ‘ i ‘abc’ 🙂
Na Oracle (9i,10g i 11g) length funkcija fino radi:
SQL> select length(‘abc ‘) from dual;
LENGTH(‘ABC’)
————-
11
By Marko on Sep 10, 2009
sql server
select len(Ltrim(Rtrim(‘ ab ‘))) -> vraća 2
koji trima prazne znakove
ako napišemo
select len(‘ab ‘) -> vratit će 2
oracle
select LENGTH(trim(‘ ab ‘)) from dual -> vraća 2
select LENGTH(‘ab ‘) from dual -> vraća 6
mysql
select length(trim(‘ ab ‘)) -> vraća 2
select length(‘ab ‘) -> vraća 4 za razliku od sql servera
postgresql
select length(‘ab ‘) -> vraća 4
select length(trim(‘ ab ‘)) -> vraća 2
By Gusar on Sep 13, 2009