[20120222]Nchar以及nvarchar2型別
我的環境:
$ echo $NLS_LANG
AMERICAN_AMERICA.ZHS16GBK
SQL> select * from v$version ;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
2.建立測試:
SQL> create table t3 (a varchar2(10),b nvarchar2(10),c char(10),d nchar(10));
Table created.
SQL> insert into t3 values('文123','文123','文123','文123');
1 row created.
SQL> commit ;
Commit complete.
SQL> column a1 format a30
SQL> column b1 format a30
SQL> column c1 format a30
SQL> column d1 format a30
SQL> select dump(a) a1,dump(b) b1,dump(c) c1,dump(d) d1 from t3;
SQL> select dump(a) a1,dump(b) b1,dump(c) c1,dump(d) d1 from t3;
A1 B1 C1 D1
------------------------------ ------------------------------ ------------------------------ ------------------------------
Typ=1 Len=5: 206,196,49,50,51 Typ=1 Len=8: 101,135,0,49,0,50 Typ=96 Len=10: 206,196,49,50,5 Typ=96 Len=20: 101,135,0,49,0,
,0,51 1,32,32,32,32,32 50,0,51,0,32,0,32,0,32,0,32,0,
32,0,32
--使用length,lengthb看看存貯的長度。
SQL> select length(a),length(b),length(c),length(d) from t3;
LENGTH(A) LENGTH(B) LENGTH(C) LENGTH(D)
---------- ---------- ---------- ----------
4 4 9 10
SQL> select lengthb(a),lengthb(b),lengthb(c),lengthb(d) from t3;
LENGTHB(A) LENGTHB(B) LENGTHB(C) LENGTHB(D)
---------- ---------- ---------- ----------
5 8 10 20
--可以發現:
1.Nchar和char型別的最好不要採用。它不足的部分使用空格補充。會導致許多問題,除了儲存消耗外。
2.nvarchar2也一樣,除了佔用空間外,每個"字元"(包括中文)後面都會加0,而且在一些程式的處理上會存在問題。例子:
SQL> select substr(b,1,2),substrb(b,1,2) from t3;
SUBS SU
---- --
文1 文
3.存在隱式轉換的問題:
SQL> variable y nvarchar2(10);
SQL> exec :y := '文123';
SQL> select * from t3 where a =:y ;
A B C D
---------- -------------------- ---------- --------------------
文123 文123 文123 文123
SQL> @dpc
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID 4an40344w91cg, child number 0
-------------------------------------
select * from t3 where a =:y
Plan hash value: 4161002650
--------------------------------------------------------
| Id | Operation | Name | E-Rows | Cost (%CPU)|
--------------------------------------------------------
| 0 | SELECT STATEMENT | | | 3 (100)|
|* 1 | TABLE ACCESS FULL| T3 | 1 | 3 (0)|
--------------------------------------------------------
Peeked Binds (identified by position):
--------------------------------------
1 - (NVARCHAR2(30), CSID=2000): '文123'
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(SYS_OP_C2C("A")=:Y)
Note
-----
- dynamic sampling used for this statement (level=2)
- Warning: basic plan statistics not available. These are only collected when:
* hint 'gather_plan_statistics' is used for the statement or
* parameter 'statistics_level' is set to 'ALL', at session or system level
30 rows selected.
--雖然可以查詢到,但是存在隱式轉換,我定義的y變數是nvarchar2型的,而表中a欄位的資料型別是varchar2,
--存在這樣會隱式轉換,filter(SYS_OP_C2C("A")=:Y),我個人的建議最好僅僅使用varchar2型別的,其它最好
--不採用。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-716915/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 資料型別CHAR, NCHAR, VARCHAR2, NVARCHAR2Oracle資料型別
- 應用中避免使用char/nchar型別型別
- char nchar varchar2 nvarchar2 區別-Oracle (varchar2 max 4K, 2K漢字)Oracle
- 過程需要型別為 'ntext/nchar/nvarchar' 的引數 '@statement'型別
- MySQL中資料型別(char(n)、varchar(n)、nchar(n)、nvarchar(n)的區別)MySql資料型別
- [20160624]慎用nvarchar2資料型別.txt資料型別
- [20151119]nvarchar2型別.txt型別
- 12c 新特性之varchar2,nvarchar2型別大小測試型別
- Python 序列型別以及函式引數型別Python型別函式
- varchar2 與 nvarchar2 區別
- java- 型別-轉換:基本型別以及包裝型別的轉換Java型別
- 【區別】Oracle官方文件中有關NVARCHAR2、VARCHAR2和VARCHAR資料型別的描述Oracle資料型別
- char,nchar,varchar,nvarchar的區別和特點
- Sql server char,nchar,varchar與Nvarchar的區別SQLServer
- Kotlin可空型別與非空型別以及`lateinit` 的作用Kotlin型別
- Oracle 中varchar2 和nvarchar2區別Oracle
- 加密型別以及相關演算法加密型別演算法
- [20221012]簡單探究nvarchar2資料型別儲存.txt資料型別
- Oracle中NVARCHAR2與VARCHAR2的區別Oracle
- 13-where與order by以及型別轉換型別
- SQL插入語句中有單引號 && SQL中char nchar varchar nvarchar的區別 && Java中字元(串)和數值型別的轉換SQLJava字元型別
- Redis多種資料型別以及使用場景Redis資料型別
- 戶外投影的型別以及優勢介紹型別
- Hive中的資料型別以及案例實操Hive資料型別
- Hive(一)資料型別以及DDL資料定義Hive資料型別
- C#程式設計引用型別和值型別 以及引用傳遞和值傳遞C#程式設計型別
- Hellow C# unity學習記錄(7)值型別引用型別以及引數傳遞C#Unity型別
- Oracle nvarchar2錯誤Oracle
- HTML5的 input:file上傳以及型別控制HTML型別
- SCI論文的型別以及寫作結構分析型別
- JavaScript中的變數、資料型別以及運算子JavaScript變數資料型別
- Java反射獲取位元組碼以及判斷型別Java反射型別
- php資料型別以及判斷isset或者empty使用PHP資料型別
- Oracle Lob型別相關引數以及效能影響Oracle型別
- 變數以及八大資料型別介紹變數大資料資料型別
- mysql索引型別Normal,Unique,Full Text區別以及索引方法Btree,Hash的區別MySql索引型別ORM
- 【JavaScript 學以致用】值的判斷以及型別轉換JavaScript型別
- 資料庫中欄位資料型別以及約束資料庫資料型別