奇怪的Oracle varchar2 长度问题 100C

最近我写了一个Oracle存储过程如下:

create table testt(param varcahr(50), len number, ts date);

create or replace procedure testp(p_a varchar)
IS
BEGIN
insert into testt(param,len,ts) values(p_a,length(p_a),sysdate);
commit;
End;

我在SQL Developer中直接执行这个存储过程 testp('12345') 系统显示长度是5,而 我使用OLEDB.Oracle驱动,使用C#程序执行这个存储过程时,发现同样的调用记录却显示长度为6.

我的系统是Windows 2008, 数据库是 Oracle 11G 11.2.0.1

我运行程序的电脑是Win 7,.Net Framwork4.5

望高手指导一下!

谢谢!

6个回答

字符串最后还有一个终结符,也占了一个存储单位。

jdsucheng
jdsucheng 回复caozhy: 问题是我直接调用存储过程就没有问题,而且我在Linux数据库上也没有碰到这个问题。
大约 5 年之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复jdsucheng: 变长的字符串,如果没有额外的字段记录长度,都需要终结符号,不然怎么知道长度呢
大约 5 年之前 回复
jdsucheng
jdsucheng 你说到点子上了,怎样移除这个终结符?有参数配置吗?
大约 5 年之前 回复

把p_a插入到数据库中,看生成的串是不是有区别就知道了。

插入了,表面上看是一样的,但是用length函数取的时候长度就是多了一位。如果我直接执行存储过程,那么长度就正确了。只是在我调用OLEDB.Oracle执行时长度就不对了。

所以我认为是OLEDB.Oracle在做string to varchar2转换时是不是加了一位null.

没有人知道原因吗?这个问题是不是算Bug

可以看看插入时字符的具体内容,看上去是c#对字符串加了一个结束符

jdsucheng
jdsucheng 是的,可惜没有人知道怎样去掉这个结束符,不知道是系统的Bug还是有设置的地方。
大约 5 年之前 回复

用oracle算长度的函数算一下c#插入的字符串

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐