Topic: 救命啊~~oracle 的varchar2类型能插入最多多少汉字?

  Print this page

1.救命啊~~oracle 的varchar2类型能插入最多多少汉字? Copy to clipboard
Posted by: luaoun
Posted on: 2003-07-22 14:50

我定义的varchar2长度有4000,但是只能插入666个汉字(1333字节数),多一个都不行!是什么问题,我的oracle字符集已经是ZH16GBK了。

2.Re:救命啊~~oracle 的varchar2类型能插入最多多少汉字? [Re: luaoun] Copy to clipboard
Posted by: li_chuansong
Posted on: 2003-07-22 14:58

oracle 规定varchar2最大值就为4000bytes,可用clob类型,你积分多少,给我呼吁一下加一分。

3.Re:救命啊~~oracle 的varchar2类型能插入最多多少汉字? [Re: luaoun] Copy to clipboard
Posted by: scud
Posted on: 2003-07-22 22:18

用流的方式保存.

4.Re:救命啊~~oracle 的varchar2类型能插入最多多少汉字? [Re: luaoun] Copy to clipboard
Posted by: wnqq
Posted on: 2003-07-23 05:39

luaoun wrote:
我定义的varchar2长度有4000,但是只能插入666个汉字(1333字节数),多一个都不行!是什么问题,我的oracle字符集已经是ZH16GBK了。


Oracle 9i 的 varchar2 最大可存 32,767 bytes.
直接存进 varchar2 只能存 4,000 bytes,
间接存就可存到 32,767 bytes.

你的 666 汉字所用的编码里 (可能是 UTF8) 每个字占了 3 bytes,
当你存的时候, 没有作好 charset-encoding 的转换,
造成你的每个 byte 被当成是 java 的一个 char (2 bytes) 来存,
总言之, 你的每个汉字要用 3x2=6 bytes 存进 oracle 中,
所以最多只能存到 4000/6=666 字.

如果你的汉字每个字只用 2 bytes,
而且存的过程正确,
那摸最多就可以存到 16,000 多个字了.

不过我还是推荐你用 clob 来存大的文字资料

5.Re:救命啊~~oracle 的varchar2类型能插入最多多少汉字? [Re: luaoun] Copy to clipboard
Posted by: dapan
Posted on: 2003-07-23 09:37

多谢wnqq!非常专业!

^_^

6.Re:救命啊~~oracle 的varchar2类型能插入最多多少汉字? [Re: wnqq] Copy to clipboard
Posted by: luaoun
Posted on: 2003-07-23 12:40

wnqq wrote:
Oracle 9i 的 varchar2 最大可存 32,767 bytes.
直接存进 varchar2 只能存 4,000 bytes,
间接存就可存到 32,767 bytes.

你的 666 汉字所用的编码里 (可能是 UTF8) 每个字占了 3 bytes,
当你存的时候, 没有作好 charset-encoding 的转换,
造成你的每个 byte 被当成是 java 的一个 char (2 bytes) 来存,
总言之, 你的每个汉字要用 3x2=6 bytes 存进 oracle 中,
所以最多只能存到 4000/6=666 字.

如果你的汉字每个字只用 2 bytes,
而且存的过程正确,
那摸最多就可以存到 16,000 多个字了.

不过我还是推荐你用 clob 来存大的文字资料

我输入了667个汉字,提交到Servlet里后再将存在String里的汉字转换成bytes再打出它的长度,打出的字节长度是1334,说明我的汉字占用了2 bytes,但是问题仍旧如此,不能插入超出最大字符数。
顺便说说clob字段类型,用了它查询速度会有影响的。

7.Re:救命啊~~oracle 的varchar2类型能插入最多多少汉字? [Re: luaoun] Copy to clipboard
Posted by: luaoun
Posted on: 2003-07-23 12:49

天煞的varchar,弄得俺都开始讨厌写程序了。Evil

8.Re:救命啊~~oracle 的varchar2类型能插入最多多少汉字? [Re: luaoun] Copy to clipboard
Posted by: wnqq
Posted on: 2003-07-23 15:02

luaoun wrote:
我输入了667个汉字,提交到Servlet里后再将存在String里的汉字转换成bytes再打出它的长度,打出的字节长度是1334,说明我的汉字占用了2 bytes,但是问题仍旧如此,不能插入超出最大字符数。
顺便说说clob字段类型,用了它查询速度会有影响的。


请您再多提出一些资料好麻?
因为只有看到这些文字说明很难找到问题的发生的地方

另外顺便问一下
(可能和问题没有关系, 我只是先确认一下)
你的 Servlet container 所用的 oracle 的相关 library 除了 classes12.jar 之外,
还有没有用到别的呢?

至于你所说的用了clob查询速度会有影响
对于这样的看法我无法给你肯定的答复
不过, clob 本来就是设记来处里大的字段的
如果这点都作不好的话
那摸 Oracle 过去几年也真的是白混了

9.Re:救命啊~~oracle 的varchar2类型能插入最多多少汉字? [Re: luaoun] Copy to clipboard
Posted by: luaoun
Posted on: 2003-07-23 21:12

我决的我的程序没有什么特殊的地方,页面提交servlet再用oracle提供的jdbc程序插入到数据库中,用的是classes12.jar没有用其它oracle的lib。
页面上有一个textarea多行文本框(列="70" 行="10"),页面内容输入完成后提交表单到servlet,servlet程序里插入数据库的语句如下:

.........
int temp = 0;
PreparedStatement pst = null;
pst = conn.prepareStatement(strSQL);
int i = 1;
pst.setString(i++, newInfoData.getInfoCode());
pst.setLong(i++, newInfoData.getTypeId());
pst.setString(i++, newInfoData.getSubject()); //这里抛错,subject字段是varchar2(4000)类型,错误信息:“超出字段最大数”
pst.setLong(i++, newInfoData.getContentFlag());
pst.setString(i++, newInfoData.getContent());
pst.setLong(i++, newInfoData.getStatus());
pst.setString(i++, newInfoData.getSource());
pst.setString(i++, newInfoData.getKeyword());
pst.setLong(i++, newInfoData.getCreatedBy());
pst.setLong(i++, newInfoData.getUpdatedBy());
pst.setLong(i++, newInfoData.getCheckupBy());
pst.setLong(i++, newInfoData.getInfoId());
temp = pst.executeUpdate();
...............


newInfoData对象是页面表单实体,包含了所有用户在页面上输入的各个字段的内容,抛错的地方我已经在上面的代码行中注释了。

其实是个很简单的程序,可就是输入的内容不能超过666个汉字即1333个bytes.

10.Re:救命啊~~oracle 的varchar2类型能插入最多多少汉字? [Re: luaoun] Copy to clipboard
Posted by: wnqq
Posted on: 2003-07-24 00:51

luaoun wrote:
我决的我的程序没有什么特殊的地方,页面提交servlet再用oracle提供的jdbc程序插入到数据库中,用的是classes12.jar没有用其它oracle的lib。
页面上有一个textarea多行文本框(列="70" 行="10"),页面内容输入完成后提交表单到servlet,servlet程序里插入数据库的语句如下:
......
newInfoData对象是页面表单实体,包含了所有用户在页面上输入的各个字段的内容,抛错的地方我已经在上面的代码行中注释了。

其实是个很简单的程序,可就是输入的内容不能超过666个汉字即1333个bytes.


sorry 丛上面的程序看不出来问题出在哪
需要更多的资讯才能找出问题所在

另外除了 classes12.jar, 你还需要加上 nls_charset12.jar,
才能正常处理汉字等多国语言.
如果运气好的话, 可能加上这个 lib 后就能解决你的问题了

11.Re:救命啊~~oracle 的varchar2类型能插入最多多少汉字? [Re: luaoun] Copy to clipboard
Posted by: why
Posted on: 2003-07-24 13:11

You may consider using NVARCHAR2, the National Language Support version of VARCHAR2.

This topic'll move to Database board soon.Smile

12.Re:救命啊~~oracle 的varchar2类型能插入最多多少汉字? [Re: why] Copy to clipboard
Posted by: wnqq
Posted on: 2003-07-24 22:38

why wrote:
You may consider using NVARCHAR2, the National Language Support version of VARCHAR2.

This topic'll move to Database board soon.Smile

要不要用 NVARCHAR2 是 optional 的
这和解决原来的问题没有直接关系

13.Re:救命啊~~oracle 的varchar2类型能插入最多多少汉字? [Re: luaoun] Copy to clipboard
Posted by: luaoun
Posted on: 2003-07-25 10:45

恩~wnqq说的是,我用了NVARCHAR2问题依旧。
我查了以前的数据库除了有3条记录的subject字段长度有超过个1333个字节长度的记录,其余的都没有超过,但是这3条记录里subject字段的内容如下所示:



上面的内容是从数据库重查出的大于1333字节的subject字段内容,好像都是uncode编码嘛~~奇怪了!

14.Re:救命啊~~oracle 的varchar2类型能插入最多多少汉字? [Re: luaoun] Copy to clipboard
Posted by: luaoun
Posted on: 2003-07-25 10:56

咦~~奇怪,我在上面的代码标签之间输入的是“&#35813”怎么变成了“该”字,被转换了?Stupid 这要Rainman来回答了

15.Re:救命啊~~oracle 的varchar2类型能插入最多多少汉字? [Re: luaoun] Copy to clipboard
Posted by: rainman
Posted on: 2003-07-25 11:01

这个问题我遇到过,原因是Oracle JDBC Driver有Bug,PreparedStatement的setString()会预检查数据类型,而这部分代码未考虑双字节字符的问题,所以就误报了。

解决方法有二:
1. 数据库编码用US7ASCII,估计此方法肯定不会采用。Smile
2. 不用PreparedStatement,而直接组成sql语句插入,这样也有弊端啦,需要自己实现一个字符串转义过程,效率也稍微差那么一点点吧。

当然还是改用CLOB字段来解决比较好吧。

16.Re:救命啊~~oracle 的varchar2类型能插入最多多少汉字? [Re: luaoun] Copy to clipboard
Posted by: luaoun
Posted on: 2003-07-25 11:15

太感谢rainman了,我到后来也开始怀疑是Oracle JDBC Driver的问题了,多谢有rainman给我这样肯定的回答,否则又要绕圈子去解决这问题了。也感谢wnqq 的帮助。
Thumbs up

17.Re:救命啊~~oracle 的varchar2类型能插入最多多少汉字? [Re: luaoun] Copy to clipboard
Posted by: wnqq
Posted on: 2003-07-25 14:30

luaoun wrote:
太感谢rainman了,我到后来也开始怀疑是Oracle JDBC Driver的问题了,多谢有rainman给我这样肯定的回答,否则又要绕圈子去解决这问题了。也感谢wnqq 的帮助。
Thumbs up

好象都没有帮到你的忙 不好意思
还是 rainman 最厉害

18.Re:救命啊~~oracle 的varchar2类型能插入最多多少汉字? [Re: luaoun] Copy to clipboard
Posted by: luaoun
Posted on: 2003-07-26 21:42

恩~他真的很厉害,我就是冲着这里有rainman才天天来这论坛看看的。没有技术高手的论坛就会缺少活力了!

19.Re:救命啊~~oracle 的varchar2类型能插入最多多少汉字? [Re: luaoun] Copy to clipboard
Posted by: rainman
Posted on: 2003-07-29 08:59

搞得我太不好意思了Embaressed ,大家互相帮助,互相学习嘛。


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923