Chinaunix

标题: NCHAR的N到底是多大? [打印本页]

作者: chdonald    时间: 2003-12-19 14:07
标题: NCHAR的N到底是多大?
我想应该和我设置的字符集有关系的,我定义了个字段姓名 NCHAR(3),想允许3个中文的,但是插入数据时可能是由于这个原因引起的错误:
inserted value too large for column
作者: txfy    时间: 2003-12-19 14:18
标题: NCHAR的N到底是多大?
昏,你这个标题可起的很艺术,varchar(3),nchar(3),那就不能超过3个字符。
作者: chdonald    时间: 2003-12-19 14:28
标题: NCHAR的N到底是多大?
不是吧?
在其他DBMS中CHAR(3)就是3个字符,NCHAR和定义的语种有关系,比如是中文,就是3个中文,实际就是6个字节
作者: chdonald    时间: 2003-12-19 14:32
标题: NCHAR的N到底是多大?
我想大家可能没有理解我的意思,其实我想问的是,我设置了NCHAR(3)表示3个中文,6个字节,其实这个N就等于2,和我设置的字符集有关系的,表示我不管输入中文还是英文,总共不可超过6个字节,我是这么理解的,但是插入3个中文时却出错,所以我想知道怎样可以查看这个N
作者: txfy    时间: 2003-12-19 14:34
标题: NCHAR的N到底是多大?
SQL>; create table testnchar(i nchar(3));

表已创建。

SQL>; insert into testnchar values('111');

已创建 1 行。

SQL>; insert into testnchar values('111111');
insert into testnchar values('111111')
                             *
ERROR 位于第 1 行:
ORA-01401: 插入的值对于列过大

SQL>; insert into testnchar values('11111');
insert into testnchar values('11111')
                             *
ERROR 位于第 1 行:
ORA-01401: 插入的值对于列过大SQL>; insert into testnchar values('真的吗');

已创建 1 行。
恩,可以的呀,那么你遇到什么问题了?
作者: txfy    时间: 2003-12-19 14:36
标题: NCHAR的N到底是多大?
select * from V$NLS_PARAMETERS where PARAMETER='NLS_NCHAR_CHARACTERSET'
作者: chdonald    时间: 2003-12-19 14:51
标题: NCHAR的N到底是多大?
1、我NLS_NCHAR_CHARACTERSET显示的是AL16UTF16,这是啥意思
2、我创建了测试表带字段NCHAR(3)
原来我理解为NCHAR(3),如果ORACLE中的NL是中文的,就应该是3个中文,即6个字节,但实际只能插入3个字节,‘111’可以插入,‘你好’就无法插入,‘111111’也无法插入了。这样的话,NCHAR(3)和CHAR(3)还有什么区别?
作者: txfy    时间: 2003-12-19 14:56
标题: NCHAR的N到底是多大?
我测试结果是无论是字符还是汉字,都能插入3个
作者: chdonald    时间: 2003-12-19 15:16
标题: NCHAR的N到底是多大?
这个问题其实涉及到一个基本概念,NCHAR是什么意思,和CHAR有什么区别,大家是怎么理解的
作者: biti_rainy    时间: 2003-12-19 15:16
标题: 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  就可以了
作者: chdonald    时间: 2003-12-19 15:39
标题: NCHAR的N到底是多大?
我还是有些地方不理解:
1、我看了下NLS_NCHAR_CHARACTERSET为AL16UTF16,就是表示2个字节吧,那NCHAR(3)就是6个字节,为什么‘1234’无法插入呢?
而且我连“好的”也无法插入
2、我的NLSCHARACTERSET为US7ASCII,不知道是否有必要改成ZHS16GBK
作者: txfy    时间: 2003-12-19 16:10
标题: NCHAR的N到底是多大?
在这里1,2,3,4等也被理解为占用两个字符,你可以看看biti的帖子
Typ=96 Len=6: 0,49,0,32,0,32 ,虽然是3个数字但是占用了6个字节(因为在你的ncharacter的蛇定下所有nchar都占用2个)。所以你想插入4个数字当然不行了!
作者: qym    时间: 2003-12-19 17:25
标题: NCHAR的N到底是多大?
原帖由 "txfy" 发表:
在这里1,2,3,4等也被理解为占用两个字符,你可以看看biti的帖子
Typ=96 Len=6: 0,49,0,32,0,32 ,虽然是3个数字但是占用了6个字节(因为在你的ncharacter的蛇定下所有nchar都占用2个)。所以你想插入4个数字当然不?.........

SQL>;  create table testNchar(a nchar(3));

Table created


SQL>;  insert into testNchar values('11');

ORA-12704: 字符集不匹配

SQL>; create table qymtest1(a char(3));

Table created
sql>; insert into qymtest1 values('11');

1 row inserted
是否与本人的NLS_NCHAR_CHARACTERSET为ZHS16GBK
本人的NLS_CHARACTERSET也为ZHS16GBK有关??
作者: chdonald    时间: 2003-12-20 11:14
标题: NCHAR的N到底是多大?
我搞定了,我把PROPS$里的内容都修改成SIMPLIFIED_CHINA.ZHS16GBK,插入3个中文也可以了。CLIENT相应改变,我的DBA STUDIO里乱码的问题都解决了
作者: biti_rainy    时间: 2003-12-20 12:46
标题: NCHAR的N到底是多大?
[quote]原帖由 "chdonald"]我搞定了,我把PROPS$里的内容都修改成SIMPLIFIED_CHINA.ZHS16GBK,插入3个中文也可以了。CLIENT相应改变,我的DBA STUDIO里乱码的问题都解决了[/quote 发表:



你牛!

你这么厉害的直接修改这个表(多半是被一些游医给引导的)

只希望你好运,今后不会被折磨!!

good  luck
作者: youngf    时间: 2003-12-23 19:58
标题: NCHAR的N到底是多大?
NCHAR means NATIONAL CHARACTER SET
   specifies the national character set used to
   store data in columns defined as NCHAR, NCLOB,
   or NVARCHAR2.If not specified, the national
   character set is the same as the database
   character set
作者: zhuanghui    时间: 2003-12-24 15:26
标题: NCHAR的N到底是多大?
搞了半天,还是字符集问题.
作者: RomanticProgram    时间: 2003-12-24 17:02
标题: NCHAR的N到底是多大?
又学到了一招。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2