SQL Server數(shù)據(jù)類型char、nchar、varchar、nvarchar的區(qū)別淺析
在SQL Server中,當(dāng)我們?cè)O(shè)置字符型字段的時(shí)候,往往有很多個(gè)數(shù)據(jù)類型供我們選擇,如:char nchar varchar nvarchar等,那么我們到底應(yīng)該選擇哪一個(gè)呢?下面就一一來描述其區(qū)別。
char:固定長度,非Unicode字符數(shù)據(jù),長度為n個(gè)字節(jié)。n的取值范圍為1至8,000,存儲(chǔ)大小是n個(gè)字節(jié)。char的SQL2003同義詞為character。
varchar:可變長度,非Unicode字符數(shù)據(jù)。n的取值范圍為1至8,000。max指示最大存儲(chǔ)大小是2^31-1個(gè)字節(jié)。存儲(chǔ)大小是輸入數(shù)據(jù)的實(shí)際長度加2個(gè)字節(jié)。所輸入數(shù)據(jù)的長度可以為0個(gè)字符。SQL-2003中的varchar就是charvarying或charactervarying。
nchar:n個(gè)字符的固定長度的Unicode字符數(shù)據(jù)。n值必須在1到4,000之間(含)。存儲(chǔ)大小為兩倍n字節(jié)。nchar的SQL-2003同義詞為nationalchar和nationalcharacter。
nvarchar:可變長度Unicode字符數(shù)據(jù)。n值在1到4,000之間(含)。max指示最大存儲(chǔ)大小為2^31-1字節(jié)。存儲(chǔ)大小是所輸入字符個(gè)數(shù)的兩倍+2個(gè)字節(jié)。所輸入數(shù)據(jù)的長度可以為0個(gè)字符。nvarchar的SQL-2003同義詞為nationalcharvarying和nationalcharactervarying。
char,varchar:最多8000個(gè)英文,4000個(gè)漢字
nchar,nvarchar:可存儲(chǔ)4000個(gè)字符,無論英文還是漢字
char,nchar:定長,速度快,占空間大,需處理
varchar,nvarchar:變長,速度慢,占空間小,無需處理
定長就是長度固定的,當(dāng)輸入的數(shù)據(jù)長度沒有達(dá)到指定的長度時(shí)將自動(dòng)以英文空格在其后面填充,使長度達(dá)到相應(yīng)的長度。
變長字符數(shù)據(jù)則不會(huì)以空格填充,比較例外的是,text存儲(chǔ)的也是可變長。
1、char。char存儲(chǔ)定長數(shù)據(jù)很方便,char字段上的索引效率級(jí)高,比如定義char(10),那么不論你存儲(chǔ)的數(shù)據(jù)是否達(dá)到了10個(gè)字節(jié),都要占去10個(gè)字節(jié)的空間,不足的自動(dòng)用空格填充,所以在讀取的時(shí)候可能要多次用到Trim()。
2、varchar。存儲(chǔ)變長數(shù)據(jù),但存儲(chǔ)效率沒有char高。如果一個(gè)字段可能的值是不固定長度的,我們只知道它不可能超過10個(gè)字符,把它定義為varchar(10)是最合算的。varchar類型的實(shí)際長度是它的值的實(shí)際長度+1。為什么“+1”呢?這一個(gè)字節(jié)用于保存實(shí)際使用了多大的長度。從空間上考慮,用varchar合適;從效率上考慮,用char合適,關(guān)鍵是根據(jù)實(shí)際情況找到權(quán)衡點(diǎn)。
3、nchar、nvarchar、ntext。這三種從名字上看比前面三種多了個(gè)“n”。它表示存儲(chǔ)的是Unicode數(shù)據(jù)類型的字符。我們知道字符中,英文字符只需要一個(gè)字節(jié)存儲(chǔ)就足夠了,但漢字眾多,需要兩個(gè)字節(jié)存儲(chǔ),英文與漢字同時(shí)存在時(shí)容易造成混亂,Unicode字符集就是為了解決字符集這種不兼容的問題而產(chǎn)生的,它所有的字符都用兩個(gè)字節(jié)表示,即英文字符也是用兩個(gè)字節(jié)表示。nchar、nvarchar的長度是在1到4000之間。和char、varchar比較起來,nchar、nvarchar則最多存儲(chǔ)4000個(gè)字符,不論是英文還是漢字;而char、varchar最多能存儲(chǔ)8000個(gè)英文,4000個(gè)漢字??梢钥闯鍪褂胣char、nvarchar數(shù)據(jù)類型時(shí)不用擔(dān)心輸入的字符是英文還是漢字,較為方便,但在存儲(chǔ)英文時(shí)數(shù)量上有些損失。
所以一般來說,如果含有中文字符,用nchar/nvarchar,如果純英文和數(shù)字,用char/varchar。
相關(guān)文章
sqlserver 數(shù)據(jù)類型轉(zhuǎn)換小實(shí)驗(yàn)
sql實(shí)驗(yàn)驗(yàn)證數(shù)據(jù)類型轉(zhuǎn)換實(shí)現(xiàn)sql語句2009-02-02在SQL?Server中使用?Try?Catch?處理異常的示例詳解
這篇文章主要介紹了如何在?SQL?Server?中使用?Try?Catch?處理異常,通過實(shí)例代碼了解 SQL Server 中的 Try-Catch 實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07SQLServer EVENTDATA()函數(shù)來獲取DDL 觸發(fā)器信息
SQL Server 2005/2008中可以使用EVENTDATA函數(shù)來獲取DDL觸發(fā)器的上下文,從而在ROLLBACK之前截獲DDL信息。EVENTDATA返回XML字段,下面的例子顯示如何截獲Drop Table的DDL信息。2009-07-07SQL Server手工插入標(biāo)識(shí)列的方法
這篇文章介紹了SQL Server手工插入標(biāo)識(shí)列的方法,有需要的朋友可以參考一下2013-10-10sql函數(shù) REGEXP_REPLACE的使用方法小結(jié)
假設(shè)您的數(shù)據(jù)在正文中有不必要的空格,您希望用單個(gè)空格來替換它們,利用REPLACE函數(shù) ,這篇文章給大家介紹sql函數(shù) REGEXP_REPLACE的使用方法小結(jié),感興趣的朋友一起看看吧2023-11-11sqlserver 動(dòng)態(tài)創(chuàng)建臨時(shí)表的語句分享
開發(fā)業(yè)務(wù)需求,需要對(duì)一個(gè)表作數(shù)據(jù)分析,由于數(shù)據(jù)量較大,而且分析時(shí)字段會(huì)隨條件相應(yīng)變化而變化2012-01-01