SQL-kiszolgáló - mi a különbség char, nchar, varchar és nvarchar között sql-ben

Csak tisztázzam. vagy összefoglalni.

  • A nchar és a nvarchar képes Unicode karaktereket tárolni.
  • char és varchar nem tárolhat Unicode karaktereket.
  • char és nchar rögzített hosszúságú, amely az Ön által megadott összeget tárolja, még akkor is, ha nem használja ezt a helyet.
  • varchar és nvarchar változó hosszúságú, amelyek csak a tárolt karakterek számára szóközöket használnak. Nem tárolja a tárolást, például char vagy nchar.

A nchar és a nvarchar kétszer annyi tárhelyet foglal el, ezért elővigyázatos, ha csak Unicode támogatásra van szüksége.

válasz érkezett Brian Kim 04 okt. 17-kor 18: 50-kor

a char és a varchar nem a Unicode tárolására szolgál, de néhány további kódolási trükkökkel és további logikával a char [var] mezőt használhatja az unicode tárolására. - Wim ten Brink 04 okt. 17-kor 18: 50-kor

Attól függ, hogy az n verzió rendelkezésre áll-e. vegye kétszer a tárhelyet, amit a válaszom mutat - Martin Smith október 04. 17-kor 18: 50-kor

Mi az előnye a tárhely fenntartásának? - mlissner 04 okt 17-kor 18: 50-kor

Az utolsó bekezdésben: Az Unicode nchar és a nvarchar használata a legtöbb esetben még jobb, javítja a feltérképezést, rugalmasságot a felhasználók számára, és kiküszöböli a jövő kompatibilitási problémáit. Egyébként a tárolóhely nem jelent problémát ebben az esetben, mert a Unicode nélkül történő rendezés nagy baj, és a jövőben a memória mennyisége tovább fog csökkenni - Jaison Varghese október 04. 17-kor 18: 50-kor

Valójában sem a char / varchar, sem a nchar / nvarchar nem tárolhatja a Unicode karakterek teljes skáláját, ezért félrevezető mondani, hogy Unicode karaktereket tárolhat, a másik pedig nem. Fix kétbájtos kódolás (az SQL Server ezt az UCS-2 nevű kódolást használja a nchar és a nvarchar esetében) nem elég nagy ahhoz, hogy fedezze a Unicode teljes körét. További részletekért lásd: Válasz. - PeterAllenWebb 04 okt. 17-kor 18: 50-kor

+1 ha mindez igaz - kta 04 oct. 17-kor 18: 50-kor

Az [n] varchar számára azonban rögzített hosszúságú karakterláncokat tárolhat, például varchar (20). Mi a különbség a char (20) és a varchar (20) között? - Ben Caine 04 okt. 17-kor 18: 50-kor

@BenCaine char (20) 20 bájtot használ (a 8 bites rendezés feltételei mellett); A varchar (20) len (adatot) +2 bájtot használ, azaz 22 a 20 bájtnyi adat, de csak 12 adat 10 bájtra. A további két bájt a hosszúságú rekord. Ha az adatok mindig teljes hosszúságúak, használja a szimbólumot, mert helyet takarít meg, és gyorsabb lehet. Kérem, soha ne használjon varcharot (1), vagy akár kevesebbet is, mint a varchar (4). Egy varchar-formátumú karakter három bájtot használ, így a char (3) soha nem fog több helyet használni, mint a varchar (3). - Richard Gadsden október 04 17-kor 18: 50-kor

@RichardGadsden Az üres varchar (3) vonal kevesebb helyet foglal el, mint az üres char (3) karakterlánc? 2 bájt, illetve 3 bájt? - andrewb 04 okt. 17-kor 18: 50-kor

Az @andrewb technikailag, de általában egy nulla, ami egyáltalán nem egy byte. - Richard Gadsden október 04 17-kor 18: 50-kor

Az egyetlen eset, hogy én tennék, hogy amikor megpróbálja áthelyezni az adatokat a program (pl asp.net web API) az SQL-szerver, és van egy sor oszlopok char, ez lehetővé teszi, hogy frissítse vagy helyezzen be semmilyen az aktuális típus. Függetlenül attól, hogy ez hibás vagy még mindig mondható-e, hogy átadja a karakterláncot. A példa az "StateAbbrv char (2)" mező a kiszolgálón és a nyilvános string StateAbbrv az alkalmazásban. - Edward 04 okt. 17-kor 18: 50-kor

Megpróbáltam általánosíthatja és korrigálni a meglévő válaszokat:

Először is, char és nchar mindig egy rögzített memória mennyiségét, akkor is, ha a húr a menteni kívánt, kevésbé rendelkezésre álló helyet, míg a varchar és nvarchar fogja használni csak az azonos mennyiségű tárhelyet tárolásához szükséges ez a sztring (plusz két byte-overhead adatokat, feltételezhetően a húr hossza tárolására). Tehát ne feledje, hogy a "var" jelentése "változó", mint egy változó térben.

A második fontos pont, hogy megértsék, hogy nchar és nvarchar tárolni húrok segítségével pontosan két bájtot karakter, míg a char és varchar használja a kódolás által meghatározott rendezési kódlapjának, amely rendszerint pontosan egy byte-ot karakter (bár alább). Két bájt per karakter, akkor tárolja a nagyon sokféle karakter, így a legfontosabb dolog, hogy emlékezzen az, hogy nchar és nvarchar sokkal jobb választás, ha szeretné, hogy támogassák nemzetközivé, akkor valószínűleg igen.

Most még néhány vékony pontot.

Először is, a nchar és a nvarchar oszlopok mindig az UCS-2 használatával tárolják az adatokat. Ez azt jelenti, hogy karakterenként pontosan két bájt fog kerülni, és az alapszintű többnyelvű síkon (BMP) bármely Unicode karakter menthető a nchar vagy a nvarchar mezőbe. Azonban bármilyen Unicode karaktert nem lehet menteni. Például a Wikipedia szerint az egyiptomi hieroglifák kódpontjai túlmutatnak a BMP-n. Így az Unicode-karakterláncok az UTF-8-ban és az Unicode-kódolásban nem szerepelhetnek az SQL Server nchar vagy a nvarchar mezőben. és az egyiptomi hieroglifákban írt sorok lesznek közöttük. Szerencsére a felhasználók valószínűleg nem írni ezt a szkriptet, de emlékezned kell erre!

Peter AllenWebb által adott válasz: 04 okt. 17-kor 18: 50-kor

  • char. rögzített hosszúságú, legfeljebb 8000 karakter hosszúságú karakteradatok.
  • nchar. Unicode rögzített hosszúságú, maximum 4000 karakter hosszúságú adatok.
  • = 8 bit hosszúságú
  • = 16 bit hosszúságú

a választ a ss. Október 04 17-kor 18: 50-kor

nchar határozott hosszúságú és unicode karaktereket tartalmazhat. két karakter bájtot használ minden karakter számára.

A varchar hossza változó, és nem tartalmazhat Unicode karaktereket. minden karakterhez egy bájtnyi tárhelyet használ.

válaszolt Manu 04 okt. 17-kor 18: 50-kor

Rossz. A Unicode minden karakterhez 1-4 bájtot (általában) használhat. Ezenkívül a varchar tartalmazhat unicode-t, de nem ismerik unicode-ként. Ennek eredményeképpen a varchar megbízhatatlan az unicode tárolására. (Ezenkívül fennáll annak a veszélye, hogy a mezőhöz hozzáférő kód nem fogja megfelelően lefordítani). - Wim ten Brink 04 okt. 17-kor 18: 50-kor

@Alex: Azt hiszem, kifejezte álláspontját, de még mindig nem értek egyet veled. Azt mondja, hogy az int CAN hosszú ideig tart, ha a hosszú méret kevesebb, mint 2 ^ 32. Ez nem csak "megbízhatatlan", hanem egy inherens korlátozás, amely lehetetlenné teszi az egész értéktartományt. - Manu 04 okt. 17-kor 18: 50-kor

Az NVARCHAR képes tárolni Unicode karaktereket, és karakterenként 2 bájtot vesz igénybe.

válaszolt Gustavo Rubio 04 okt. 17-kor 18: 50-kor

Rossz! A Unicode karakterenként 1-4 bájtot használ! Sokan elfelejtik! Még az UTF-16 használatával is előfordulhat, hogy egyes karakterek 2 bájt helyett 4 bájtot okoznak, bár a teljes hossza 2 bájt. Néhány más Unicode alformátum több mint 4 bájtot foglalhat el! - Wim ten Brink 04 okt. 17-kor 18: 50-kor

@WimtenBrink - Az SQL Server és a nvarchar kérdése mindig karakterenként 2 bájtot tartalmaz. - Martin Smith október 04 17-kor 18: 50-kor

  • A repository mérete n bájt.
  • A szimbólum ISO szinonimája szimbólum.

Összefoglalásként jutottunk el. Mert nem adtunk meg egy hosszúságot char számára. Az alapértelmezett hossza 1 lesz.

  • Stringes adatok változó hosszúságúak, nem Unicode.
  • n határozza meg a húr hosszát, és értéke 1-8000 lehet.
  • A max azt jelzi, hogy a maximális tárolási méret 2 ^ 31-1 byte (2 GB).
  • A repository mérete a megadott adatok tényleges hossza + 2 byte.
  • A varcharnak az ISO szinonimái eltérő karaktert vagy karaktert tartalmaznak.
  • Unicode karakterláncok rögzített hosszúságú adatokkal.
  • n meghatározza a húr hosszát, és értéke 1 és 4000 között van.
  • Szinonimák Az ISO a nchar számára nemzeti szimbólum és nemzeti jelleg.

nvarchar [(n | max)]

  • String adatok Unicode változó hosszúságú.
  • n meghatározza a húr hosszát, és értéke 1 és 4000 között lehet.
  • A max azt jelzi, hogy a maximális tárolási méret 2 ^ 31-1 byte (2 GB).
  • A nvarchar ISO-szinonimái nemzeti jellegűek és eltérő nemzeti jellegűek.

válaszadva vikram reddy 04 okt. 17-kor 18: 50-kor