- 论坛徽章:
- 0
|
NCHAR的N到底是多大?
nchar(3 表达3个字符
SQL>; create table testNchar(a nchar(3));
Table created.
SQL>; insert into testNchar values('1234');
insert into testNchar values('1234')
*
ERROR at line 1:
ORA-01401: inserted value too large for column
SQL>; insert into testNchar values('好的');
1 row created.
SQL>; commit;
Commit complete.
SQL>; select * from testnchar;
A
------
好的
SQL>; select dump(a) from testNchar;
DUMP(A)
--------------------------------------------------------------------------------
Typ=96 Len=6: 89,125,118,132,0,32
SQL>; insert into testNchar values(1);
1 row created.
SQL>; insert into testNchar values('好好好');
1 row created.
SQL>; commit;
Commit complete.
SQL>; select dump(a) from testnchar;
DUMP(A)
--------------------------------------------------------------------------------
Typ=96 Len=6: 89,125,118,132,0,32
Typ=96 Len=6: 0,49,0,32,0,32
Typ=96 Len=6: 89,125,89,125,89,125
我们可以看到 Len = 6 表示长度为6个字节!
那么一个字符到底是几个字节,nchar/nvarchar /nclob 等是由这个参数决定的
SQL>; select * from nls_database_parameters where parameter = 'NLS_NCHAR_CHARACTERSET';
PARAMETER
------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_NCHAR_CHARACTERSET
AL16UTF16
SQL>;
注意这里不是 V$NLS_PARAMETERS!!!
Nchar 表示多字节字符,比如 AL16UTF16/AL16UTF24/AL16UTF32 分别表示 2字节/3字节/4字节字符
使用 char 类型,单字节字符就用一个字节存储,跟这个参数相关
SQL>; select * from nls_database_parameters where parameter = 'NLS_CHARACTERSET';
PARAMETER
------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_CHARACTERSET
ZHS16GBK
SQL>;
也就是说,两种不同的字符集分别对应了 char /Nchar 的存储
通常不必要使用 Nchar ,使用 char/varchar/varchar2/clob 就可以了 |
|