免费注册 查看新帖 |

Chinaunix

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

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

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

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

NCHAR的N到底是多大?

昏,你这个标题可起的很艺术,varchar(3),nchar(3),那就不能超过3个字符。

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

NCHAR的N到底是多大?

不是吧?
在其他DBMS中CHAR(3)就是3个字符,NCHAR和定义的语种有关系,比如是中文,就是3个中文,实际就是6个字节

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

NCHAR的N到底是多大?

我想大家可能没有理解我的意思,其实我想问的是,我设置了NCHAR(3)表示3个中文,6个字节,其实这个N就等于2,和我设置的字符集有关系的,表示我不管输入中文还是英文,总共不可超过6个字节,我是这么理解的,但是插入3个中文时却出错,所以我想知道怎样可以查看这个N

论坛徽章:
0
5 [报告]
发表于 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 行。
恩,可以的呀,那么你遇到什么问题了?

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

NCHAR的N到底是多大?

select * from V$NLS_PARAMETERS where PARAMETER='NLS_NCHAR_CHARACTERSET'

论坛徽章:
0
7 [报告]
发表于 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)还有什么区别?

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

NCHAR的N到底是多大?

我测试结果是无论是字符还是汉字,都能插入3个

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

NCHAR的N到底是多大?

这个问题其实涉及到一个基本概念,NCHAR是什么意思,和CHAR有什么区别,大家是怎么理解的

论坛徽章:
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