MS SQL: Da li je razmak punopravan znak?

Wednesday, 09.09.2009 – Zidar

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

🙂

  1. 2 Responses to “MS SQL: Da li je razmak punopravan znak?”

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

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

Post a Comment