一 varchar,nvarchar,
四個類型都屬于變長字符類型, varchar和varchar2的區別在與后者把所有字符都占兩字節,前者只對漢字和全角等字符占兩字節。 nvarchar和nvarchar2的區別和上面一樣, 與上面區別在于是根據Unicode 標準所進行的定義的類型,通常用于支持多國語言類似系統的定義。
1.char
char的長度是固定的,比如說,你定義了char(20),即使你你插入abc,不足二十個字節,數據庫也會在abc后面自動加上17個空格,以補足二十個字節;
char是區分中英文的,中文在char中占兩個字節,而英文占一個,所以char(20)你只能存20個字母或10個漢字。
char適用于長度比較固定的,一般不含中文的情況
2.varchar/varchar2
varchar是長度不固定的,比如說,你定義了varchar(20),當你插入abc,則在數據庫中只占3個字節。
varchar同樣區分中英文,這點同char。
varchar2基本上等同于varchar,它是oracle自己定義的一個非工業標準varchar,不同在于,varchar2用null代替varchar的空字符串
varchar/varchar2適用于長度不固定的,一般不含中文的情況
3.nvarchar/nvarchar2
nvarchar和nvarchar2是長度不固定的
nvarchar不區分中英文,比如說:你定義了nvarchar(20),你可以存入20個英文字母/漢字或中英文組合,這個20定義的是字符數而不是字節數
nvarchar2基本上等同于nvarchar,不同在于nvarchar2中存的英文字母也占兩個字節
nvarchar/nvarchar2適用于存放中文
char [ ( n ) ]
固定長度,非 Unicode 字符數據,長度為 n 個字節。n 的取值范圍為 1 至 8,000,存儲大小是 n 個字節。
varchar [ ( n | max ) ]
可變長度,非 Unicode 字符數據。n 的取值范圍為 1 至 8,000。max 指示最大存儲大小是 2^31-1 個字節。存儲大小是輸入數據的實際長度加 2 個字節,用于反映存儲的數據的長度。所輸入數據的長度可以為 0 個字符。
* 如果列數據項的大小一致,則使用 char。
* 如果列數據項的大小差異相當大,則使用 varchar。
* 如果列數據項大小相差很大,而且大小可能超過 8,000 字節,請使用 varchar(max)。
如果未在數據定義或變量聲明語句中char 或 varchar 數據類型指定 n,則默認長度為 1。如果在使用 CAST 和 CONVERT 函數時char 或 varchar 數據類型未指定 n,則默認長度為 30。
當執行 CREATE TABLE 或 ALTER TABLE 時,如果 SET ANSI_PADDING 為 OFF,則定義為 NULL 的 char 列將作為 varchar 處理。
1.NULL值(空值)。
a. char列的NULL值占用存儲空間。
b. varcahr列的NULL值不占用存儲空間。
c. 插入同樣數量的NULL值,varchar列的插入效率明顯高出char列。
2.插入數據
無論插入數據涉及的列是否建立索引,char的效率都明顯低于varchar。
3. 更新數據
如果更新的列上未建立索引,則char的效率低于varchar,差異不大;建立索引的話,效率較高。
4. 修改結構
a. 無論增加或是刪除的列的類型是char還是varchar,操作都能較快的完成,而且效率上沒有什么差異。
b. 對于增加列的寬度而言,char與varchar有非常明顯的效率差異,修改varcahr列基本上不花費時間,而修改char列需要花費很長的時間。
5.數據檢索
無論是否通過索引,varchar類型的數據檢索略優于char的掃描。
選擇char還是選擇varchar的建議
1.適宜于char的情況:
a. 列中的各行數據長度基本一致,長度變化不超過50字節;
b. 數據變更頻繁,數據檢索的需求較少。
c. 列的長度不會變化,修改char類型列的寬度的代價比較大。
d. 列中不會出現大量的NULL值。
e. 列上不需要建立過多的索引,過多的索引對char列的數據變更影響較大。
2.適宜于varchar的情況;
a. 列中的各行數據的長度差異比較大。
b. 列中數據的更新非常少,但查詢非常頻繁。
c. 列中經常沒有數據,為NULL值或為空值
nchar [ ( n ) ]
n 個字符的固定長度的 Unicode 字符數據。n 值必須在 1 到 4,000 之間(含)。存儲大小為兩倍 n 字節。
nvarchar [ ( n | max ) ]
可變長度 Unicode 字符數據。n 值在 1 到 4,000 之間(含)。max 指示最大存儲大小為 2^31-1 字節。存儲大小是所輸入字符個數的兩倍 + 2 個字節。所輸入數據的長度可以為 0 個字符。
注釋
如果沒有在數據定義或變量聲明語句中指定 n,則默認長度為 1。如果沒有使用 CAST 函數指定 n,則默認長度為 30。
如果列數據項的大小可能相同,請使用 nchar。
如果列數據項的大小可能差異很大,請使用 nvarchar。
sysname 是系統提供的用戶定義數據類型,除了不可為空值外,在功能上與 nvarchar(128) 相同。sysname 用于引用數據庫對象名。
為使用 nchar 或 nvarchar 的對象分配的是默認的數據庫排序規則,但可使用 COLLATE 子句分配特定的排序規則。
SET ANSI_PADDING ON 永遠適用于 nchar 和 nvarchar。SET ANSI_PADDING OFF 不適用于 nchar 或 nvarchar 數據類型。
在Oracle中CHAR,NCHAR,VARCHAR,VARCHAR2,NVARCHAR2這五種類型的區別
1.CHAR(size)和VARCHAR(size)的區別
CHAR為定長的字段,最大長度為2K字節;
VARCHAR為可變長的字段,最大長度為4K字節;
2.CHAR(size)和NCHAR(size)的區別
CHAR如果存放字母數字占1個字節,存放GBK編碼的漢字存放2個字節,存放UTF-8編碼的漢字占用3個字節;
NCHAR根據所選字符集來定義存放字符的占用字節數,一般都為2個字節存放一個字符(不管字符或者漢字)
3.VARCHAR(size)和VARCHAR2(size)的區別
在現在的版本中,兩者是沒有區別的;最大長度為4K字節;推薦使用VARCHAR2;
4.VARCHAR2(size)和NVARCHAR2(size)的區別
最大長度為4K字節,區別同CHAR與NCHAR的區別;(如果數據庫字符集長度是2,則NVARCHAR2最大為2K)
5.共同特性
當執行insert的時候,插入的值為'',則轉變成null,即insert ... values('') <=> insert ... values(null)
搜索的條件須用where xx is null
6.例子
比如有一個性別字段,里面存放“男,女”的其中一個值,兩種常用選擇
CHAR(2) 和 NCHAR(1)