Articles

Välilyönnit SQL Server

Katso tämän viikon video Youtubessa

kauan sitten rakensin sovellus, joka vangiksi käyttäjä syöttää. Sovelluksen yksi ominaisuus oli verrata käyttäjän syötettä arvotietokantaan.

sovellus suoritti tämän tekstivertailun osana SQL Server stored-menettelyä, jonka avulla voin tarvittaessa päivittää liiketoimintalogiikan helposti tulevaisuudessa.

Yksi päivä, olen saanut sähköpostia käyttäjälle sanomalla, että arvo ne olivat kirjoittamalla oli vastaava tietokanta arvo, että he tiesivät, että pitäisi ottelu., Se on päivä löysin SQL Server laskuri intuitiivinen tasa-arvo vertailu käsiteltäessä perään Space merkkiä.

Pehmustettu valkoinen tila

Olet luultavasti tietoinen siitä, että CHAR-tietotyyppi tyynyt arvo välilyönneillä, kunnes määritelty pituus on saavutettu:

LEN() toiminto näyttää joukko merkkejä, meidän merkkijono, kun taas DATALENGTH() toiminto näyttää meille, kuinka monta tavua käytetään merkkijonon.

tässä tapauksessa DATALENGTH on yhtä suuri kuin 10., Tämä tulos johtuu pehmustetuista tiloista, jotka esiintyvät merkin ”a”jälkeen määritellyn nieriän pituuden täyttämiseksi 10. Voimme vahvistaa tämän muuntamalla arvon heksadesimaaliksi. Näemme arvon 61 (”A” Hexissä), jota seuraa yhdeksän ” 20 ” arvoa (välilyöntejä).

Jos muutamme muuttujan tietotyyppi VARCHAR, näemme arvo ei ole enää pehmustettu tilat:

ottaen Huomioon, että yksi näiden tietojen tyypit tyynyt arvojen kanssa tilaa merkkejä, kun taas toinen ei tiedä, mitä tapahtuu, jos vertaamme kaksi?,

tässä tapauksessa SQL Server katsoo molempia arvoja yhtä, vaikka emme voi vahvistaa, että DATALENGTHs ovat erilaisia.

tämä käyttäytyminen ei kuitenkaan tapahdu vain sekatyyppisten vertailujen yhteydessä. Jos vertaamme kahta saman tietotyypin arvoa yhteen arvoon, joka sisältää useita avaruusmerkkejä, koemme jotain…odottamaton:

vaikka meidän kaksi muuttujilla on eri arvot (tyhjä verrattuna neljä tilaa merkkiä), SQL Server katsoo, että nämä arvot yhtä suuret.,

Jos me lisätä merkin joitakin perään välilyönnillä näemme sama ongelma:

Molemmat arvot ovat selvästi erilaisia, mutta SQL Server katsoo, että ne ovat keskenään yhtä suuret. Kytkentä tasa-arvon merkki LIKE-operaattori muuttaa asioita hieman:

vaikka en olisi sitä mieltä, että ilman mitään yleismerkkejä käyttäytyvät aivan kuin yhtäläisyysmerkki, SQL Server ei toimi nämä vertaukset samalla tavalla.,

Jos me siirtyä takaisin meidän yhtäläisyysmerkki vertailu ja etuliite meidän luonnetta arvo välilyönneillä, me myös huomata eri tulos:

SQL Server katsoo kaksi arvoa yhtä suuri riippumatta siitä, tiloihin tapahtuu lopussa merkkijono. Merkkijonoa edeltäviä välilyöntejä ei kuitenkaan enää pidetty vastaavina.

Mitä on tekeillä?

ANSI

kun taas Counter intuitiivinen, SQL Serverin toiminnallisuus on perusteltua., SQL Server noudattaa ANSI-erittelyä merkkijonojen vertailussa lisäämällä merkkijonoihin valkoista tilaa niin, että ne ovat saman pituisia ennen niiden vertailua. Tämä selittää näkemämme ilmiöt.

se ei kuitenkaan tee näin samankaltaisen operaattorin kanssa, mikä selittää käyttäytymisen eron.

Vertailuja, kun ylimääräiset välilyönnit väliä

oletetaan, että haluamme tehdä vertailun, jossa ero välilyönnit asioissa.

yksi vaihtoehto on käyttää samankaltaista operaattoria, kuten näimme muutamia esimerkkejä takaisin., Tämä ei kuitenkaan ole tyypillistä samankaltaisen operaattorin käyttöä, joten muista kommentoida ja selittää, mitä kyselysi yrittää tehdä käyttämällä sitä. Viimeinen asia mitä haluat on joku tulevaisuuden ylläpitäjä koodin vaihtaa sen takaisin yhtä merkki, koska he eivät näe mitään villi kortti merkkiä.

Toinen vaihtoehto, että olen nähnyt on suorittaa DATALENGTH vertailun lisäksi vertailu:

Tämä ratkaisu ei ole oikein, että jokainen skenaario kuitenkin., Alkajaisiksi, sinulla ei ole keinoa tietää, jos SQL Server tulee suorittaa vertailu-tai DATALENGTH predikaatti ensin. Tämä voi romuttaa havoc indeksin käyttöä ja aiheuttaa huono suorituskyky.

vakavampi ongelma voi syntyä, jos vertaat kenttiä eri tietotyyppeihin., Esimerkiksi, kun verrataan VARCHAR että NVARCHAR tietojen tyyppi, se on melko helppo luoda skenaario, jossa vertailu kysely käyttäen DATALENGTH laukaisee vääriä positiivisia:

Tässä NVARCHAR myymälöissä 2 tavua jokaisen merkin, aiheuttaa DATALENGTHs yksi merkki NVARCHAR olla sama hahmo + tilaa VARCHAR arvo.

parasta näissä tilanteissa on ymmärtää tietosi ja valita ratkaisu, joka toimii sinun tilanteeseen.,

ja ehkä trim tietosi ennen lisäystä (jos se on järkevää tehdä niin)!