在Oracle中CHAR,NCHAR,VARCHAR,VARCHAR2,NVARCHAR2这五种类型的区别
生活随笔
收集整理的這篇文章主要介紹了
在Oracle中CHAR,NCHAR,VARCHAR,VARCHAR2,NVARCHAR2这五种类型的区别
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【在Oracle中CHAR,NCHAR,VARCHAR,VARCHAR2,NVARCHAR2這五種類(lèi)型的區(qū)別 】
1.CHAR(size)和VARCHAR(size)的區(qū)別?
CHAR為定長(zhǎng)的字段,最大長(zhǎng)度為2K字節(jié);?VARCHAR為可變長(zhǎng)的字段,最大長(zhǎng)度為4K字節(jié);?
2.CHAR(size)和NCHAR(size)的區(qū)別?
CHAR如果存放字母數(shù)字占1個(gè)字節(jié),存放GBK編碼的漢字存放2個(gè)字節(jié),存放UTF-8編碼的漢字占用3個(gè)字節(jié);?NCHAR根據(jù)所選字符集來(lái)定義存放字符的占用字節(jié)數(shù),一般都為2個(gè)字節(jié)存放一個(gè)字符(不管字符或者漢字)?
3.VARCHAR(size)和VARCHAR2(size)的區(qū)別?
在現(xiàn)在的版本中,兩者是沒(méi)有區(qū)別的;最大長(zhǎng)度為4K字節(jié);推薦使用VARCHAR2;?
4.VARCHAR2(size)和NVARCHAR2(size)的區(qū)別?
最大長(zhǎng)度為4K字節(jié),區(qū)別同CHAR與NCHAR的區(qū)別;(如果數(shù)據(jù)庫(kù)字符集長(zhǎng)度是2,則NVARCHAR2最大為2K)?
5.共同特性?
當(dāng)執(zhí)行insert的時(shí)候,插入的值為'',則轉(zhuǎn)變成null,即insert ... values('') <=> insert ... values(null)?搜索的條件須用where xx is null?
6.例子?
比如有一個(gè)性別字段,里面存放“男,女”的其中一個(gè)值,兩種常用選擇?CHAR(2) ? ?和 NCHAR(1) ?
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
varchar和varchar2,nvarchar和nvarchar2,四個(gè)類(lèi)型都屬于變長(zhǎng)字符類(lèi)型。varchar和varchar2的區(qū)別在與后者把所有字符都占兩字節(jié),前者只對(duì)漢字和全角等字符占兩字節(jié)。nvarchar和nvarchar2的區(qū)別和上面一樣,與上面區(qū)別在于是根據(jù)Unicode標(biāo)準(zhǔn)所進(jìn)行的定義的類(lèi)型,通常用于支持多國(guó)語(yǔ)言類(lèi)似系統(tǒng)的定義。?
1.char?
char的長(zhǎng)度是固定的,比如說(shuō),你定義了char(20),即使你你插入abc,不足二十個(gè)字節(jié),數(shù)據(jù)庫(kù)也會(huì)在abc后面自動(dòng)加上17個(gè)空格,以補(bǔ)足二十個(gè)字節(jié);?
char是區(qū)分中英文的,中文在char中占兩個(gè)字節(jié),而英文占一個(gè),所以char(20)你只能存20個(gè)字母或10個(gè)漢字。?
char適用于長(zhǎng)度比較固定的,一般不含中文的情況?
2.varchar/varchar2?
varchar是長(zhǎng)度不固定的,比如說(shuō),你定義了varchar(20),當(dāng)你插入abc,則在數(shù)據(jù)庫(kù)中只占3個(gè)字節(jié)。?
varchar同樣區(qū)分中英文,這點(diǎn)同char。?
varchar2基本上等同于varchar,它是oracle自己定義的一個(gè)非工業(yè)標(biāo)準(zhǔn)varchar,不同在于,varchar2用null代替varchar的空字符串?
varchar/varchar2適用于長(zhǎng)度不固定的,一般不含中文的情況?
3.nvarchar/nvarchar2?
nvarchar和nvarchar2是長(zhǎng)度不固定的?
nvarchar不區(qū)分中英文,比如說(shuō):你定義了nvarchar(20),你可以存入20個(gè)英文字母/漢字或中英文組合,這個(gè)20定義的是字符數(shù)而不是字節(jié)數(shù)?
nvarchar2基本上等同于nvarchar,不同在于nvarchar2中存的英文字母也占兩個(gè)字節(jié)?
nvarchar/nvarchar2適用于存放中文?
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■【char [ ( n ) ] 】
固定長(zhǎng)度,非 Unicode 字符數(shù)據(jù),長(zhǎng)度為 n 個(gè)字節(jié)。n 的取值范圍為 1 至 8,000,存儲(chǔ)大小是 n 個(gè)字節(jié)。?
■■■【varchar [ ( n | max ) ] 】
可變長(zhǎng)度,非 Unicode 字符數(shù)據(jù)。n 的取值范圍為 1 至 8,000。max 指示最大存儲(chǔ)大小是 2^31-1 個(gè)字節(jié)。存儲(chǔ)大小是輸入數(shù)據(jù)的實(shí)際長(zhǎng)度加 2 個(gè)字節(jié),用于反映存儲(chǔ)的數(shù)據(jù)的長(zhǎng)度。所輸入數(shù)據(jù)的長(zhǎng)度可以為 0 個(gè)字符。?
* 如果列數(shù)據(jù)項(xiàng)的大小一致,則使用 char。?* 如果列數(shù)據(jù)項(xiàng)的大小差異相當(dāng)大,則使用 varchar。?* 如果列數(shù)據(jù)項(xiàng)大小相差很大,而且大小可能超過(guò) 8,000 字節(jié),請(qǐng)使用 varchar(max)。?
如果未在數(shù)據(jù)定義或變量聲明語(yǔ)句中char 或 varchar 數(shù)據(jù)類(lèi)型指定 n,則默認(rèn)長(zhǎng)度為 1。如果在使用 CAST 和 CONVERT 函數(shù)時(shí)char 或 varchar 數(shù)據(jù)類(lèi)型未指定 n,則默認(rèn)長(zhǎng)度為 30。?當(dāng)執(zhí)行 CREATE TABLE 或 ALTER TABLE 時(shí),如果 SET ANSI_PADDING 為 OFF,則定義為 NULL 的 char 列將作為 varchar 處理。?
1.NULL值(空值)。?
a. char列的NULL值占用存儲(chǔ)空間。?
b. varcahr列的NULL值不占用存儲(chǔ)空間。?
c. 插入同樣數(shù)量的NULL值,varchar列的插入效率明顯高出char列。?
2.插入數(shù)據(jù)?
無(wú)論插入數(shù)據(jù)涉及的列是否建立索引,char的效率都明顯低于varchar。?
3. 更新數(shù)據(jù)?
如果更新的列上未建立索引,則char的效率低于varchar,差異不大;建立索引的話,效率較高。?
4. 修改結(jié)構(gòu)?
a. 無(wú)論增加或是刪除的列的類(lèi)型是char還是varchar,操作都能較快的完成,而且效率上沒(méi)有什么差異。?
b. 對(duì)于增加列的寬度而言,char與varchar有非常明顯的效率差異,修改varcahr列基本上不花費(fèi)時(shí)間,而修改char列需要花費(fèi)很長(zhǎng)的時(shí)間。?
5.數(shù)據(jù)檢索?
無(wú)論是否通過(guò)索引,varchar類(lèi)型的數(shù)據(jù)檢索略優(yōu)于char的掃描。?
選擇char還是選擇varchar的建議?
1.適宜于char的情況:?
a. 列中的各行數(shù)據(jù)長(zhǎng)度基本一致,長(zhǎng)度變化不超過(guò)50字節(jié);?
b. 數(shù)據(jù)變更頻繁,數(shù)據(jù)檢索的需求較少。?
c. 列的長(zhǎng)度不會(huì)變化,修改char類(lèi)型列的寬度的代價(jià)比較大。?
d. 列中不會(huì)出現(xiàn)大量的NULL值。?
e. 列上不需要建立過(guò)多的索引,過(guò)多的索引對(duì)char列的數(shù)據(jù)變更影響較大。?
2.適宜于varchar的情況;?
a. 列中的各行數(shù)據(jù)的長(zhǎng)度差異比較大。?
b. 列中數(shù)據(jù)的更新非常少,但查詢非常頻繁。?
c. 列中經(jīng)常沒(méi)有數(shù)據(jù),為NULL值或?yàn)榭罩?
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■【nchar [ ( n ) ]】?
n 個(gè)字符的固定長(zhǎng)度的 Unicode 字符數(shù)據(jù)。n 值必須在 1 到 4,000 之間(含)。存儲(chǔ)大小為兩倍 n 字節(jié)。?
■■■【nvarchar [ ( n | max ) ] 】
可變長(zhǎng)度 Unicode 字符數(shù)據(jù)。n 值在 1 到 4,000 之間(含)。max 指示最大存儲(chǔ)大小為 2^31-1 字節(jié)。存儲(chǔ)大小是所輸入字符個(gè)數(shù)的兩倍 + 2 個(gè)字節(jié)。所輸入數(shù)據(jù)的長(zhǎng)度可以為 0 個(gè)字符。?
***
如果沒(méi)有在數(shù)據(jù)定義或變量聲明語(yǔ)句中指定 n,則默認(rèn)長(zhǎng)度為 1。如果沒(méi)有使用 CAST 函數(shù)指定 n,則默認(rèn)長(zhǎng)度為 30。?
如果列數(shù)據(jù)項(xiàng)的大小可能相同,請(qǐng)使用 nchar。?
如果列數(shù)據(jù)項(xiàng)的大小可能差異很大,請(qǐng)使用 nvarchar。?
sysname 是系統(tǒng)提供的用戶定義數(shù)據(jù)類(lèi)型,除了不可為空值外,在功能上與 nvarchar(128) 相同。sysname 用于引用數(shù)據(jù)庫(kù)對(duì)象名。?
為使用 nchar 或 nvarchar 的對(duì)象分配的是默認(rèn)的數(shù)據(jù)庫(kù)排序規(guī)則,但可使用 COLLATE 子句分配特定的排序規(guī)則。?
SET ANSI_PADDING ON 永遠(yuǎn)適用于 nchar 和 nvarchar。SET ANSI_PADDING OFF 不適用于 nchar 或 nvarchar 數(shù)據(jù)類(lèi)型。?
1.CHAR(size)和VARCHAR(size)的區(qū)別?
CHAR為定長(zhǎng)的字段,最大長(zhǎng)度為2K字節(jié);?VARCHAR為可變長(zhǎng)的字段,最大長(zhǎng)度為4K字節(jié);?
2.CHAR(size)和NCHAR(size)的區(qū)別?
CHAR如果存放字母數(shù)字占1個(gè)字節(jié),存放GBK編碼的漢字存放2個(gè)字節(jié),存放UTF-8編碼的漢字占用3個(gè)字節(jié);?NCHAR根據(jù)所選字符集來(lái)定義存放字符的占用字節(jié)數(shù),一般都為2個(gè)字節(jié)存放一個(gè)字符(不管字符或者漢字)?
3.VARCHAR(size)和VARCHAR2(size)的區(qū)別?
在現(xiàn)在的版本中,兩者是沒(méi)有區(qū)別的;最大長(zhǎng)度為4K字節(jié);推薦使用VARCHAR2;?
4.VARCHAR2(size)和NVARCHAR2(size)的區(qū)別?
最大長(zhǎng)度為4K字節(jié),區(qū)別同CHAR與NCHAR的區(qū)別;(如果數(shù)據(jù)庫(kù)字符集長(zhǎng)度是2,則NVARCHAR2最大為2K)?
5.共同特性?
當(dāng)執(zhí)行insert的時(shí)候,插入的值為'',則轉(zhuǎn)變成null,即insert ... values('') <=> insert ... values(null)?搜索的條件須用where xx is null?
6.例子?
比如有一個(gè)性別字段,里面存放“男,女”的其中一個(gè)值,兩種常用選擇?CHAR(2) ? ?和 NCHAR(1) ?
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
varchar和varchar2,nvarchar和nvarchar2,四個(gè)類(lèi)型都屬于變長(zhǎng)字符類(lèi)型。varchar和varchar2的區(qū)別在與后者把所有字符都占兩字節(jié),前者只對(duì)漢字和全角等字符占兩字節(jié)。nvarchar和nvarchar2的區(qū)別和上面一樣,與上面區(qū)別在于是根據(jù)Unicode標(biāo)準(zhǔn)所進(jìn)行的定義的類(lèi)型,通常用于支持多國(guó)語(yǔ)言類(lèi)似系統(tǒng)的定義。?
1.char?
char的長(zhǎng)度是固定的,比如說(shuō),你定義了char(20),即使你你插入abc,不足二十個(gè)字節(jié),數(shù)據(jù)庫(kù)也會(huì)在abc后面自動(dòng)加上17個(gè)空格,以補(bǔ)足二十個(gè)字節(jié);?
char是區(qū)分中英文的,中文在char中占兩個(gè)字節(jié),而英文占一個(gè),所以char(20)你只能存20個(gè)字母或10個(gè)漢字。?
char適用于長(zhǎng)度比較固定的,一般不含中文的情況?
2.varchar/varchar2?
varchar是長(zhǎng)度不固定的,比如說(shuō),你定義了varchar(20),當(dāng)你插入abc,則在數(shù)據(jù)庫(kù)中只占3個(gè)字節(jié)。?
varchar同樣區(qū)分中英文,這點(diǎn)同char。?
varchar2基本上等同于varchar,它是oracle自己定義的一個(gè)非工業(yè)標(biāo)準(zhǔn)varchar,不同在于,varchar2用null代替varchar的空字符串?
varchar/varchar2適用于長(zhǎng)度不固定的,一般不含中文的情況?
3.nvarchar/nvarchar2?
nvarchar和nvarchar2是長(zhǎng)度不固定的?
nvarchar不區(qū)分中英文,比如說(shuō):你定義了nvarchar(20),你可以存入20個(gè)英文字母/漢字或中英文組合,這個(gè)20定義的是字符數(shù)而不是字節(jié)數(shù)?
nvarchar2基本上等同于nvarchar,不同在于nvarchar2中存的英文字母也占兩個(gè)字節(jié)?
nvarchar/nvarchar2適用于存放中文?
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■【char [ ( n ) ] 】
固定長(zhǎng)度,非 Unicode 字符數(shù)據(jù),長(zhǎng)度為 n 個(gè)字節(jié)。n 的取值范圍為 1 至 8,000,存儲(chǔ)大小是 n 個(gè)字節(jié)。?
■■■【varchar [ ( n | max ) ] 】
可變長(zhǎng)度,非 Unicode 字符數(shù)據(jù)。n 的取值范圍為 1 至 8,000。max 指示最大存儲(chǔ)大小是 2^31-1 個(gè)字節(jié)。存儲(chǔ)大小是輸入數(shù)據(jù)的實(shí)際長(zhǎng)度加 2 個(gè)字節(jié),用于反映存儲(chǔ)的數(shù)據(jù)的長(zhǎng)度。所輸入數(shù)據(jù)的長(zhǎng)度可以為 0 個(gè)字符。?
* 如果列數(shù)據(jù)項(xiàng)的大小一致,則使用 char。?* 如果列數(shù)據(jù)項(xiàng)的大小差異相當(dāng)大,則使用 varchar。?* 如果列數(shù)據(jù)項(xiàng)大小相差很大,而且大小可能超過(guò) 8,000 字節(jié),請(qǐng)使用 varchar(max)。?
如果未在數(shù)據(jù)定義或變量聲明語(yǔ)句中char 或 varchar 數(shù)據(jù)類(lèi)型指定 n,則默認(rèn)長(zhǎng)度為 1。如果在使用 CAST 和 CONVERT 函數(shù)時(shí)char 或 varchar 數(shù)據(jù)類(lèi)型未指定 n,則默認(rèn)長(zhǎng)度為 30。?當(dāng)執(zhí)行 CREATE TABLE 或 ALTER TABLE 時(shí),如果 SET ANSI_PADDING 為 OFF,則定義為 NULL 的 char 列將作為 varchar 處理。?
1.NULL值(空值)。?
a. char列的NULL值占用存儲(chǔ)空間。?
b. varcahr列的NULL值不占用存儲(chǔ)空間。?
c. 插入同樣數(shù)量的NULL值,varchar列的插入效率明顯高出char列。?
2.插入數(shù)據(jù)?
無(wú)論插入數(shù)據(jù)涉及的列是否建立索引,char的效率都明顯低于varchar。?
3. 更新數(shù)據(jù)?
如果更新的列上未建立索引,則char的效率低于varchar,差異不大;建立索引的話,效率較高。?
4. 修改結(jié)構(gòu)?
a. 無(wú)論增加或是刪除的列的類(lèi)型是char還是varchar,操作都能較快的完成,而且效率上沒(méi)有什么差異。?
b. 對(duì)于增加列的寬度而言,char與varchar有非常明顯的效率差異,修改varcahr列基本上不花費(fèi)時(shí)間,而修改char列需要花費(fèi)很長(zhǎng)的時(shí)間。?
5.數(shù)據(jù)檢索?
無(wú)論是否通過(guò)索引,varchar類(lèi)型的數(shù)據(jù)檢索略優(yōu)于char的掃描。?
選擇char還是選擇varchar的建議?
1.適宜于char的情況:?
a. 列中的各行數(shù)據(jù)長(zhǎng)度基本一致,長(zhǎng)度變化不超過(guò)50字節(jié);?
b. 數(shù)據(jù)變更頻繁,數(shù)據(jù)檢索的需求較少。?
c. 列的長(zhǎng)度不會(huì)變化,修改char類(lèi)型列的寬度的代價(jià)比較大。?
d. 列中不會(huì)出現(xiàn)大量的NULL值。?
e. 列上不需要建立過(guò)多的索引,過(guò)多的索引對(duì)char列的數(shù)據(jù)變更影響較大。?
2.適宜于varchar的情況;?
a. 列中的各行數(shù)據(jù)的長(zhǎng)度差異比較大。?
b. 列中數(shù)據(jù)的更新非常少,但查詢非常頻繁。?
c. 列中經(jīng)常沒(méi)有數(shù)據(jù),為NULL值或?yàn)榭罩?
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■【nchar [ ( n ) ]】?
n 個(gè)字符的固定長(zhǎng)度的 Unicode 字符數(shù)據(jù)。n 值必須在 1 到 4,000 之間(含)。存儲(chǔ)大小為兩倍 n 字節(jié)。?
■■■【nvarchar [ ( n | max ) ] 】
可變長(zhǎng)度 Unicode 字符數(shù)據(jù)。n 值在 1 到 4,000 之間(含)。max 指示最大存儲(chǔ)大小為 2^31-1 字節(jié)。存儲(chǔ)大小是所輸入字符個(gè)數(shù)的兩倍 + 2 個(gè)字節(jié)。所輸入數(shù)據(jù)的長(zhǎng)度可以為 0 個(gè)字符。?
***
如果沒(méi)有在數(shù)據(jù)定義或變量聲明語(yǔ)句中指定 n,則默認(rèn)長(zhǎng)度為 1。如果沒(méi)有使用 CAST 函數(shù)指定 n,則默認(rèn)長(zhǎng)度為 30。?
如果列數(shù)據(jù)項(xiàng)的大小可能相同,請(qǐng)使用 nchar。?
如果列數(shù)據(jù)項(xiàng)的大小可能差異很大,請(qǐng)使用 nvarchar。?
sysname 是系統(tǒng)提供的用戶定義數(shù)據(jù)類(lèi)型,除了不可為空值外,在功能上與 nvarchar(128) 相同。sysname 用于引用數(shù)據(jù)庫(kù)對(duì)象名。?
為使用 nchar 或 nvarchar 的對(duì)象分配的是默認(rèn)的數(shù)據(jù)庫(kù)排序規(guī)則,但可使用 COLLATE 子句分配特定的排序規(guī)則。?
SET ANSI_PADDING ON 永遠(yuǎn)適用于 nchar 和 nvarchar。SET ANSI_PADDING OFF 不適用于 nchar 或 nvarchar 數(shù)據(jù)類(lèi)型。?
總結(jié)
以上是生活随笔為你收集整理的在Oracle中CHAR,NCHAR,VARCHAR,VARCHAR2,NVARCHAR2这五种类型的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: decode 实例
- 下一篇: 宽字符编码和解码通用类[CodeWidt