Sqlserver中char,nchar,varchar與Nvarchar的區(qū)別分析
對(duì)英文(ASCII)字符占用1個(gè)字節(jié),對(duì)一個(gè)漢字占用2個(gè)字節(jié),CHAR存儲(chǔ)定長數(shù)據(jù)很方便,CHAR字段上的索引效率極高,比如定義char(10),那么不論你存儲(chǔ)的數(shù)據(jù)是否達(dá) 到了10個(gè)字節(jié),都要占去10個(gè)字節(jié)的空間。因?yàn)槭枪潭ㄩL度,所以速度效率高。比如定義char(10),那么不論你存儲(chǔ)的數(shù)據(jù)是否達(dá)到了10個(gè)字節(jié),都要占去10個(gè)字節(jié)的空間。因?yàn)槭枪潭ㄩL度,所以速度效率高。
2. VARCHAR存儲(chǔ)變長數(shù)據(jù)
如果一個(gè)字段可能的值是不固定長度的,我們只知道它不可能超過10個(gè)字符,把它定義為 VARCHAR(10)是最合算的。VARCHAR類型的實(shí)際長度是它的值的實(shí)際長度+1。為什么“+1”呢?這一個(gè)字節(jié)用于保存實(shí)際使用了多大的長度。
Varchar類型:Varchar 的類型不以空格填滿,而Char則會(huì)填充滿為止,如varchar(100),但它的值只是"qian",所以它在數(shù)據(jù)庫中存的值就是"qian",而char 不一樣,如char(100),它的 值是"qian",而實(shí)際上它在數(shù)據(jù)庫中是"qian "(qian后共有96個(gè)空格,就是把它填滿為100個(gè)字節(jié))。
注:由于char是以固定長度的,所以它的速度會(huì)比varchar快得多!但程序處理起來要麻煩一點(diǎn),要用trim之類的函數(shù)把兩邊的空格去掉!
3. Nchar類型和Nvarchar類型是怎么一回事呢?
為了與其他多種字符的轉(zhuǎn)換,如中文,音標(biāo)等,對(duì)每個(gè)英文(ASCII)字符都占用2個(gè)字節(jié),對(duì)一個(gè)漢字也占用兩個(gè)字節(jié),所有的字符都占用2個(gè)字節(jié)。
varchar(n):變長型字符數(shù)據(jù)類型,存儲(chǔ)最長長度為8,000 個(gè)字符
nvarchar(n):可變長度 Unicode 數(shù)據(jù),其最大長度為 4,000 字符.字節(jié)的存儲(chǔ)大小是所輸入字符個(gè)數(shù)的兩倍,就是說它是雙字節(jié)來存儲(chǔ)數(shù)據(jù)的。如果存儲(chǔ)數(shù)據(jù)如果存在單字節(jié)時(shí),它也是以雙字節(jié)來占用存儲(chǔ)空間的。
varchar一般適用于英文和數(shù)字,Nvarchar適用中文和其他字符,其中N表示Unicode常量,可以解決多語言字符集之間的轉(zhuǎn)換問題。
以下是補(bǔ)充:
對(duì)于程序中的一般字符串類型的字段,SQL Server中有char、varchar、nchar、nvarchar四種類型來對(duì)應(yīng),那么這四種類型有什么區(qū)別呢,這里做一下對(duì)比。
1.定長或變長
所謂定長就是長度固定,當(dāng)要保存的數(shù)據(jù)長度不夠時(shí)將自動(dòng)在其后面填充英文空格,使長度達(dá)到相應(yīng)的長度;有var前綴的,表示是實(shí)際存儲(chǔ)空間是動(dòng)態(tài)變化的,比如varchar,nvarchar變長字符數(shù)據(jù)則不會(huì)以空格填充。
2.Unicode或非Unicode
數(shù)據(jù)庫中,英文字符只需要一個(gè)字節(jié)存儲(chǔ)就足夠了,但漢字和其他眾多非英文字符,則需要兩個(gè)字節(jié)存儲(chǔ)。如果英文與漢字同時(shí)存在,由于占用空間數(shù)不同,容易造成混亂,導(dǎo)致讀取出來的字符串是亂碼。Unicode字符集就是為了解決字符集這種不兼容的問題而產(chǎn)生的,它所有的字符都用兩個(gè)字節(jié)表示,即英文字符也是用兩個(gè)字節(jié)表示。而前綴n就表示Unicode字符,比如nchar,nvarchar,這兩種類型使用了Unicode字符集。
3.幾種數(shù)據(jù)類型的存儲(chǔ)的最大容量
char,varchar 最多8000個(gè)英文,4000個(gè)漢字
nchar,nvarchar 最多可存儲(chǔ)4000個(gè)字符,無論英文還是漢字
- sql中的char與varchar有什么區(qū)別
- MySQL中varchar和char類型的區(qū)別
- MYSQL中 char 和 varchar的區(qū)別
- Oralce中VARCHAR2()與NVARCHAR2()的區(qū)別介紹
- MySQL中VARCHAR與CHAR格式數(shù)據(jù)的區(qū)別
- MySQL數(shù)據(jù)庫char與varchar的區(qū)別分析及使用建議
- 深入SQL Server中定長char(n)與變長varchar(n)的區(qū)別詳解
- 深入SQL Server中char、varchar、text和nchar、nvarchar、ntext的區(qū)別詳解
- 詳解數(shù)據(jù)庫varchar與char有哪些區(qū)別
相關(guān)文章
sqlserver建立新用戶及關(guān)聯(lián)數(shù)據(jù)庫教程
本文講的是SQLserver數(shù)據(jù)庫創(chuàng)建新用戶方法以及賦予此用戶特定權(quán)限的方法,非常的簡單實(shí)用,有需要的小伙伴可以參考下2018-01-01SqlServer備份數(shù)據(jù)庫的4種方式介紹
這篇文章主要介紹了SqlServer備份數(shù)據(jù)庫的4種方式介紹,本文講解了用sqlserver的維護(hù)計(jì)劃、通過腳本+作業(yè)的方式備份數(shù)據(jù)庫(非xp_cmdshell和xp_cmdshell)、用powershell調(diào)用sqlcmd來執(zhí)行備份命令幾種方式,需要的朋友可以參考下2015-02-02SQL中遇到多條相同內(nèi)容只取一條的最簡單實(shí)現(xiàn)方法
本文主要介紹SQL中遇到多條相同內(nèi)容只取一條的最簡單實(shí)現(xiàn)方法,比較實(shí)用,希望能給大家做一個(gè)參考。2016-06-06判斷觸發(fā)器正在處理的是插入,刪除還是更新觸發(fā)
平常時(shí)寫觸發(fā)器(TRIGGER),一般會(huì)分別寫插入(INSERT),刪除(DELETE)和更新(UPDATE)單獨(dú)的觸發(fā)器2012-01-01Sql存儲(chǔ)過程游標(biāo)循環(huán)的用法及sql如何使用cursor寫一個(gè)簡單的循環(huán)
這篇文章主要介紹了循環(huán)和游標(biāo)在Sql存儲(chǔ)過程中使用及sql如何使用cursor寫一個(gè)簡單的循環(huán)的相關(guān)資料,需要的朋友可以參考下2015-11-11SQL Server Alwayson創(chuàng)建代理作業(yè)的注意事項(xiàng)詳解
在工作中有時(shí)為了避免數(shù)據(jù)庫增長太大所以需要定時(shí)來刪除某段時(shí)間前的數(shù)據(jù),所以使用代理作業(yè)的方式來實(shí)現(xiàn)定時(shí)刪除的功能,下面這篇文章主要給大家介紹了關(guān)于SQL Server Alwayson創(chuàng)建代理作業(yè)的注意事項(xiàng),需要的朋友可以參考下。2017-09-09SQL Server中Check約束的學(xué)習(xí)教程
這篇文章主要介紹了SQL Server中Check約束的學(xué)習(xí)教程,包括對(duì)啟用Check約束來提升性能的介紹,需要的朋友可以參考下2015-12-12