日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Sqlserver中char,nchar,varchar与Nvarchar的区别

發(fā)布時(shí)間:2024/4/11 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Sqlserver中char,nchar,varchar与Nvarchar的区别 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.?char類(lèi)型:?

對(duì)英文(ASCII)字符占用1個(gè)字節(jié),對(duì)一個(gè)漢字占用2個(gè)字節(jié),CHAR存?儲(chǔ)定長(zhǎng)數(shù)據(jù)很方便,CHAR字段上的索引效率極高,比如定義char(10),那么不論你存儲(chǔ)的數(shù)據(jù)是否達(dá)到了10個(gè)字節(jié),都要占去10個(gè)字節(jié)的空?間。因?yàn)槭枪潭ㄩL(zhǎng)度,所以速度效率高。比如定義char(10),那么不論你存儲(chǔ)的數(shù)據(jù)是否達(dá)到了10個(gè)字節(jié),都要占去10個(gè)字節(jié)的空間。因?yàn)槭枪潭ㄩL(zhǎng)?度,所以速度效率高。?

2.?VARCHAR存儲(chǔ)變長(zhǎng)數(shù)據(jù)

如果一個(gè)字段可能的值是不固定長(zhǎng)度的,我們只知道它不可能超過(guò)10個(gè)字符,把它定義為?VARCHAR(10)是最合算的。VARCHAR類(lèi)型的實(shí)際長(zhǎng)度是它的值的實(shí)際長(zhǎng)度+1。為什么“+1”呢?這一個(gè)字節(jié)用于保存實(shí)際使用了多大的長(zhǎng)度。?
 ? ?Varchar類(lèi)型:Varchar?的類(lèi)型不以空格填滿(mǎn),而Char則會(huì)填充滿(mǎn)為止,如varchar(100),但它的值只是"qian",所以它在數(shù)據(jù)庫(kù)中存的值就是"qian",而?char?不一樣,如char(100),它的  值是"qian",而實(shí)際上它在數(shù)據(jù)庫(kù)中是"qian?"(qian后共有96個(gè)空格,就是把它填滿(mǎn)為100個(gè)字節(jié))。?
注:由于char是以固定長(zhǎng)度的,所以它的速度會(huì)比varchar快得多!但程序處理起來(lái)要麻煩一點(diǎn),要用ltrim(或者rtrim)之類(lèi)的函數(shù)把兩邊的空格去掉!?
3.?Nchar類(lèi)型和Nvarchar類(lèi)型是怎么一回事呢?

為了與其他多種字符的轉(zhuǎn)換,如中文,音標(biāo)等,對(duì)每個(gè)英文(ASCII)字符都占用2個(gè)字節(jié),對(duì)一個(gè)漢字也占用兩個(gè)字節(jié),所有的字符都占用2個(gè)字節(jié)。?

  varchar(n):變長(zhǎng)型字符數(shù)據(jù)類(lèi)型,存儲(chǔ)最長(zhǎng)長(zhǎng)度為8,000?個(gè)字符?
  nvarchar(n):可變長(zhǎng)度?Unicode?數(shù)據(jù),其最大長(zhǎng)度為?4,000?字符.字節(jié)的存儲(chǔ)大小是所輸入字符個(gè)數(shù)的兩倍,就是說(shuō)它是雙字節(jié)來(lái)存儲(chǔ)數(shù)據(jù)的。如果存儲(chǔ)數(shù)據(jù)如果存在單字節(jié)時(shí),它也是以雙字節(jié)來(lái)占用存儲(chǔ)空間的。?

  varchar一般適用于英文和數(shù)字,Nvarchar適用中文和其他字符,其中N表示Unicode常量,可以解決多語(yǔ)言字符集之間的轉(zhuǎn)換問(wèn)題。?

以下是補(bǔ)充:

對(duì)于程序中的一般字符串類(lèi)型的字段,SQL?Server中有char、varchar、nchar、nvarchar四種類(lèi)型來(lái)對(duì)應(yīng),那么這四種類(lèi)型有什么區(qū)別呢,這里做一下對(duì)比。

1.定長(zhǎng)或變長(zhǎng)

所謂定長(zhǎng)就是長(zhǎng)度固定,當(dāng)要保存的數(shù)據(jù)長(zhǎng)度不夠時(shí)將自動(dòng)在其后面填充英文空格,使長(zhǎng)度達(dá)到相應(yīng)的長(zhǎng)度;有var前綴的,表示是實(shí)際存儲(chǔ)空間是動(dòng)態(tài)變化的,比如varchar,nvarchar變長(zhǎng)字符數(shù)據(jù)則不會(huì)以空格填充。

2.Unicode或非Unicode

數(shù)據(jù)庫(kù)中,英文字符只需要一個(gè)字節(jié)存儲(chǔ)就足夠了,但漢字和其他眾多非英文字符,則需要兩個(gè)字節(jié)存儲(chǔ)。如果英文與漢字同時(shí)存在,由于占用空間數(shù)不同,?容易造成混亂,導(dǎo)致讀取出來(lái)的字符串是亂碼。Unicode字符集就是為了解決字符集這種不兼容的問(wèn)題而產(chǎn)生的,它所有的字符都用兩個(gè)字節(jié)表示,即英文字?符也是用兩個(gè)字節(jié)表示。而前綴n就表示Unicode字符,比如nchar,nvarchar,這兩種類(lèi)型使用了Unicode字符集。

3.幾種數(shù)據(jù)類(lèi)型的存儲(chǔ)的最大容量

char,varchar?最多8000個(gè)英文,4000個(gè)漢字

nchar,nvarchar??最多可存儲(chǔ)4000個(gè)字符,無(wú)論英文還是漢字

?==========================================================================================================================

1)?????? 定義:

char:??? 固定長(zhǎng)度,存儲(chǔ)ANSI字符,不足的補(bǔ)英文半角空格。

nchar:?? 固定長(zhǎng)度,存儲(chǔ)Unicode字符,不足的補(bǔ)英文半角空格

varchar:? 可變長(zhǎng)度,存儲(chǔ)ANSI字符,根據(jù)數(shù)據(jù)長(zhǎng)度自動(dòng)變化。

nvarchar: 可變長(zhǎng)度,存儲(chǔ)Unicode字符,根據(jù)數(shù)據(jù)長(zhǎng)度自動(dòng)變化。

?

nvarchar(n) :包含 n個(gè)字符的可變長(zhǎng)度 Unicode 字符數(shù)據(jù)。n 的值必須介于 1? 與? 4,000 之間。字節(jié)的存儲(chǔ)大小是所輸入字符個(gè)數(shù)的兩倍。所輸入的數(shù)據(jù)字符長(zhǎng)度可以為零。

? varchar[(n)]:長(zhǎng)度為 n 個(gè)字節(jié)的可變長(zhǎng)度且非 Unicode的字符數(shù)據(jù)。n 必須是一個(gè)介于?? 1 和 8,000之間的數(shù)值。存儲(chǔ)大小為輸入數(shù)據(jù)的字節(jié)的實(shí)際長(zhǎng)度,而不是 n 個(gè)字節(jié)。所輸入的數(shù)據(jù)字符長(zhǎng)度可以為零。

注意: ?????ANSI主要是以單字節(jié)來(lái)存儲(chǔ)數(shù)據(jù),一般適合英文。而我們常用的漢字需要用兩個(gè)字節(jié)來(lái)存儲(chǔ),所以就要使用unicode的數(shù)據(jù)類(lèi)型,不然讀取出來(lái)的數(shù)據(jù)可能會(huì)亂碼。

(2)區(qū)別:

????? ①?gòu)拇鎯?chǔ)方式上,nvarchar是按字符存儲(chǔ)的,而 varchar是按字節(jié)存儲(chǔ)的;

????? ②從存儲(chǔ)量上考慮, varchar比較節(jié)省空間,因?yàn)榇鎯?chǔ)大小為字節(jié)的實(shí)際長(zhǎng)度,而 nvarchar是雙字節(jié)存儲(chǔ);

????? ③在使用上,如果存儲(chǔ)內(nèi)容都是英文字符而沒(méi)有漢字等其他語(yǔ)言符號(hào),建議使用varchar;含有漢字的使用nvarchar,因?yàn)閚varchar是使用Unicode編碼,即統(tǒng)一的字符編碼標(biāo)準(zhǔn),會(huì)減少亂碼的出現(xiàn)幾率;

④?? 如果你做的項(xiàng)目可能涉及不同語(yǔ)言之間的轉(zhuǎn)換,建議用nvarchar。

(3)優(yōu)缺點(diǎn):

?? Nvarchar優(yōu)點(diǎn):判斷字符串的時(shí)候可以不需要考慮中英文兩種字符的差別,可以避免程序中亂碼的問(wèn)題。

?????????? 缺點(diǎn):存儲(chǔ)英文字符會(huì)增大一倍的存儲(chǔ)空間.但是在存儲(chǔ)代價(jià)已經(jīng)很低廉的情況下,優(yōu)先考慮兼容性會(huì)給你帶來(lái)更多好處的,效率沒(méi)有varchar高。

(4)為什么要用nvarchar?

??? 有n前綴的,n表示Unicode字符,即所有字符都占兩個(gè)字節(jié),nchar,nvarchar

字符中,英文字符只需要一個(gè)字節(jié)存儲(chǔ)就足夠了,但漢字眾多,需要兩個(gè)字節(jié)存儲(chǔ),英文與漢字同時(shí)存在時(shí)容易造成混亂,Unicode字符集就是為了解決字符集這種不兼容的問(wèn)題而產(chǎn)生的,它所有的字符都用兩個(gè)字節(jié)表示,即英文字符也是用兩個(gè)字節(jié)表示。

(5)有關(guān)var的簡(jiǎn)單介紹:

有var前綴的,表示是實(shí)際存儲(chǔ)空間是變長(zhǎng)的,varchar,nvarchar

所謂定長(zhǎng)就是長(zhǎng)度固定的,當(dāng)輸入的數(shù)據(jù)長(zhǎng)度沒(méi)有達(dá)到指定的長(zhǎng)度時(shí)將自動(dòng)以英文空格在其后面填充,使長(zhǎng)度達(dá)到相應(yīng)的長(zhǎng)度;而變長(zhǎng)字符數(shù)據(jù)則不會(huì)以空格填充,比較例外的是,text存儲(chǔ)的也是可變長(zhǎng)。

(6)如何使用這些類(lèi)型?

如果你肯定存儲(chǔ)的數(shù)據(jù)長(zhǎng)度,而且不包中文的,可以選擇char類(lèi)型。

如果肯定存儲(chǔ)的數(shù)據(jù)長(zhǎng)度,但可能包括中文,可以選擇nchar類(lèi)型。

如果不確定存儲(chǔ)的數(shù)據(jù)長(zhǎng)度,存儲(chǔ)只有英文、數(shù)字的最好用varchar

如果不確定存儲(chǔ)的數(shù)據(jù)長(zhǎng)度,也有可能有中文,可以選擇nvarchar類(lèi)型,在SQL Server2005中也是比較常用的字符數(shù)據(jù)類(lèi)型。


超強(qiáng)干貨來(lái)襲 云風(fēng)專(zhuān)訪(fǎng):近40年碼齡,通宵達(dá)旦的技術(shù)人生

總結(jié)

以上是生活随笔為你收集整理的Sqlserver中char,nchar,varchar与Nvarchar的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。