今天在数据库(10.2.0.5,字符集是ZHS16GBK)做一个测试,一张表上建一个varchar2(4000)的字段,然后select这张表for update,往该字段里复制汉字,结果发现最多只能复制进去1000个汉字,再多就报错ORA-01480:trailing null missing from STR bind value.dump了汉字看过,一个汉字占两字节。改用全英文,最大只能复制进去2000个字母。
在网上找到一种解释是:在存储过程中varchar2可以传递4000个字符(2000个汉字),而在表结构中varchar2最多可以保存2000个字符(1000个汉字),所以虽然可以传递4000个字符,在保存到数据库中时,会自动截取。
但是这种解释貌似官方文档上找不到,不知道是不是这么回事?
在网上找到一种解释是:在存储过程中varchar2可以传递4000个字符(2000个汉字),而在表结构中varchar2最多可以保存2000个字符(1000个汉字),所以虽然可以传递4000个字符,在保存到数据库中时,会自动截取。
但是这种解释貌似官方文档上找不到,不知道是不是这么回事?
解决方案 »
- shutdown immediate时,没有commit的事务是提交还是回滚?
- DB2 向ORACLE 迁移 一个SQL语句问题
- 高手救急!oracle9 600错误 内部错误代码,参数16201
- utl_file的buffer(缓冲区)如何设置
- 项目中遇到的问题,关于多表连接和子查询的,希望高手帮忙解答!谢谢啦!
- 数据库笔试题求正确答案
- 公司购买了一套b/s系统,采用oracle服务器,进行前几个录入操作时还可以,多了就太慢,重新登陆系统就会好一点。问题是出在哪里
- 请问这样的问题oracle是否需要重装啊?
- 请问:Oracle中,将内容转换为字符串和截取字符串的一部分的函数是什么,谢谢了
- 还是DBLINK的问题?请教?
- 异步执行oracle存储过程
- 求一条高难SQL!
----------
1005SQL> select lengthb(nn) from t;LENGTHB(NN)
-----------
2010
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
二楼那只是凑巧、以下是我的测试sys@ORCL> select * from sys.props$ where name='NLS_CHARACTERSET';NAME VALUE$ COMMENT$
-------------------- ---------- --------------------
NLS_CHARACTERSET AL32UTF8 Character sethr@ORCL> drop table t purge;Table dropped.hr@ORCL> create table t(nn varchar2(4000));Table created.hr@ORCL> insert into t select rpad('一',2010,'二') from dual;1 row created.hr@ORCL> select lengthb(nn) from t;LENGTHB(NN)
-----------
3015hr@ORCL> select length(nn) from t;LENGTH(NN)
----------
1005hr@ORCL> select dump(nn) from t;DUMP(NN)
----------------------------------------------------------------------------------------------------
Typ=1 Len=3015: 228,184,128,228,186,140,228,186,140,228,186,140,228,186,140,228,186,140,228,186,140,
228,186,140,228,186,140,228,186,140,228,186,140,228,186,140,228,186,140,228,186,140,228,186,140,228,
186,140,228,186,140,228,186,140,228,186,140,228,186,140,228,186,140,228,186,140,228,186,140,228,186,
140,228,186,140,228,186,140,228,186,140,228,186,140,228,186,140,228,186,140,228,186,140,228,186,140,
228,186,140,228,186,140,228,186,140,228,186,140,228,186,140,228,186,140,228,186,140,228,186,140,228,
186,140,228,186,140,228,186,140,228,186,140,228,186,140,228,186,140,228,186,140,228,186,140,228,186,
140,228,186,140,228,186,140,228,186,140,228,186,140,228,186,140,228,186,140,228,186,140,228,186,140,
但是这种解释貌似官方文档上找不到,不知道是不是这么回事? 这种SB解释只要有脑袋的人都不信,PL/SQL中varchar2的长度是1~32767
varchar2(4000 byte)
遇到多字节字符的时候,varchar2(4000 byte)最坏的结果只能存 1000个字符,可能每个字符站四个字节.
varchar2(4000 char)是可以存4000个字符的
这就意味着在10g中,只要字段不是N开头的,那么存储汉字都是两个字节表示一个汉字(基本如此),所以说无法存入2000个汉字,在10g中是不可能的。
而有时候无法存入,这只能说明工具有问题,非oracle的问题,某些工具,譬如PL/SQL DEVELOPER不同的版本有一些差异,有些对处理这里字符就会存在问题,这主要是因为这类工具很多是用OCI接口编写的,而C处理字符串如果没有弄好,就变得有问题。所以,总结下,这是工具的问题,oracle不至于会犯那么根本上的问题。
你这个例子跟我这边做结果是一样,我现在才发现,rpad填充时,n是代表字节长度,而不是字符长度!?所以n=2010时插入总共是1005个汉字
那么5楼的实验如何解释啊?为什么最终长度超过了2010字节!