免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3358 | 回复: 17
打印 上一主题 下一主题

NCHAR的N到底是多大? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-12-19 14:07 |只看该作者 |正序浏览
我想应该和我设置的字符集有关系的,我定义了个字段姓名 NCHAR(3),想允许3个中文的,但是插入数据时可能是由于这个原因引起的错误:
inserted value too large for column

论坛徽章:
0
18 [报告]
发表于 2003-12-24 17:02 |只看该作者

NCHAR的N到底是多大?

又学到了一招。

论坛徽章:
0
17 [报告]
发表于 2003-12-24 15:26 |只看该作者

NCHAR的N到底是多大?

搞了半天,还是字符集问题.

论坛徽章:
0
16 [报告]
发表于 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

论坛徽章:
0
15 [报告]
发表于 2003-12-20 12:46 |只看该作者

NCHAR的N到底是多大?

[quote]原帖由 "chdonald"]我搞定了,我把PROPS$里的内容都修改成SIMPLIFIED_CHINA.ZHS16GBK,插入3个中文也可以了。CLIENT相应改变,我的DBA STUDIO里乱码的问题都解决了[/quote 发表:



你牛!

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

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

good  luck

论坛徽章:
0
14 [报告]
发表于 2003-12-20 11:14 |只看该作者

NCHAR的N到底是多大?

我搞定了,我把PROPS$里的内容都修改成SIMPLIFIED_CHINA.ZHS16GBK,插入3个中文也可以了。CLIENT相应改变,我的DBA STUDIO里乱码的问题都解决了

论坛徽章:
0
13 [报告]
发表于 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有关??

论坛徽章:
0
12 [报告]
发表于 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个数字当然不行了!

论坛徽章:
0
11 [报告]
发表于 2003-12-19 15:39 |只看该作者

NCHAR的N到底是多大?

我还是有些地方不理解:
1、我看了下NLS_NCHAR_CHARACTERSET为AL16UTF16,就是表示2个字节吧,那NCHAR(3)就是6个字节,为什么‘1234’无法插入呢?
而且我连“好的”也无法插入
2、我的NLSCHARACTERSET为US7ASCII,不知道是否有必要改成ZHS16GBK

论坛徽章:
0
10 [报告]
发表于 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  就可以了
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP