Oracle的varchar2问题!

hax 2002-06-15 01:57:32
问题就是Oracle的varchar2为什么只能有4k长?虽然很多人知晓这一点,却没有人能向我解释这个限制的原因,是设计上为了效率的缘故吗?但是其他的数据库都没有这样的限制,一般至少支持32k长。而且为何在PL/SQL里又能用到32K呢?这样我的PL/SQL程序产生了超过4k的字符串,却又不能直接存储到数据库,有什么意义呢?

还有,我现在管理的网站的后台程序写的时候有点bug(用jsp的jdbc-odbc桥,不是我写的),造成有时候会向Oracle数据库(版本8i)写稍稍超过4k的字符串,这样的结果好像就是oracle没有报错,但占用CPU率升高,这样两三次之后,经常造成数据库服务器的CPU占用率100%,我只好重新启动数据库服务。为什么会是这种情况?为什么Oracle不返回错误给JSP程序?

我也考虑是否不用varchar2而用blob,但是有人说blob的效率差很多,而且无法使用intermedia的全文检索功能(我希望在以后两个月里增加全文检索的功能)。

希望高手能给我指点迷津,或者指示我应该看哪些文章和书籍也可以。

谢谢!
...全文
441 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
KingSunSha 2002-06-17
  • 打赏
  • 举报
回复
做了一下简单的测试,如下:
1、建立表
SQL> create table tbl_test_varchar2
2 (col1 varchar2(4000));
Table created.

2、尝试向表中插入长度超过4000的字符串
SQL> declare
2 tmp varchar2(6000):='0123456789';
3 begin
4 for i in 1..599 loop
5 tmp := tmp || '0123456789';
6 end loop;
7 dbms_output.put_line(to_char(length(tmp)));
8 insert into tbl_test_varchar2(col1) values (tmp);
9 end;
10 /
declare
*
ERROR at line 1:
ORA-01461: can bind a LONG value only for insert into a LONG column
ORA-06512: at line 8

3、oracle报错了,认为该字符串应该为一个long类型

我感觉是你的前台提供了自动截去超长部分的功能,不是oracle的问题。
penitent 2002-06-17
  • 打赏
  • 举报
回复
我曾经碰到过这种问题long和long raw类型变量的大小就不能超过32k,但varchar2不是这样的啊,我认为KingSunSha说的还是有道理的,你的变量定义是放在哪里的,程序中还是过程中
hax 2002-06-16
  • 打赏
  • 举报
回复
不过还是有两个问题。一个是作为变量的varchar2可以有32k,可是由于只能存储4k,他的应用岂不是很尴尬?另一个是为什么只有Oracle有这种限制?

另外我前面的问题,为什么插入超过4k的字符串,oracle不返回错误给jsp?
hax 2002-06-16
  • 打赏
  • 举报
回复
谢谢你的回答,KingSunSha,我会至少给你100分。
KingSunSha 2002-06-16
  • 打赏
  • 举报
回复
varchar2有2个概念,一个是做为字段类型,最大4000字节(如果采用的是单字节的字符集来存储汉字之类的双字节字符,那其实只能存储2000个字);另一个是做为变量类型,最大长度是32k,变量类型只能在pl/sql块中应用。

其实4k作为大部分字符型数据存储应该是够了,太大的可变长度字符必定会影响效率。oracle处理字符类型的大文本用clob类型,除了用dbms_lob来处理,还可以启用intermedia选项,开启了该选项就能使用全文搜索功能,效率相当不错。

其实oracle中很多限制是为了通盘考虑性能和安全性,比如大小写敏感就是为了提高效率、在pl/sql块中对ddl的种种限制是为了数据的安全性。与其抱怨限制条件,不如想想怎么解决
hax 2002-06-16
  • 打赏
  • 举报
回复
就这样的回答,让我怎么给分?唉,csdn真是令人失望。
3yugui 2002-06-15
  • 打赏
  • 举报
回复
也许oracle公司考虑到目前情况下>4k时,clob类型的存取机制由于varchar2类型的存取机制。
lws0472 2002-06-15
  • 打赏
  • 举报
回复
oracle7.3的varchar2长度限制为2k,oracle8.0以上的为4k,是有长度限制的,这也许是oracle对性能的考虑,建议你用clob型
zhptj 2002-06-15
  • 打赏
  • 举报
回复
同意楼上
biti_rainy 2002-06-15
  • 打赏
  • 举报
回复
如果varchar2长度是8k,你会问为什么只有8k的.呵呵
建议你采用clob而不是blob
clob是可以进行全文检索的,oracle提供了包函数的: dbms_lob包
xg_delayth 2002-06-15
  • 打赏
  • 举报
回复
关注
up

2,596

社区成员

发帖
与我相关
我的任务
社区描述
Sybase相关技术讨论区
社区管理员
  • Sybase社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧