和同事讨论来去感觉是JDBC驱动的问题。不知道你们是否遇到过类似的问题?有什么好的解决办法吗?或者是我们哪里有错误?还请不吝赐教。
相关信息:
使用CLASS12.JAR为JDBC驱动ORACLE8i,该提交的表单共有10个字段。另有2个HIDDEN字段。
和同事讨论来去感觉是JDBC驱动的问题。不知道你们是否遇到过类似的问题?有什么好的解决办法吗?或者是我们哪里有错误?还请不吝赐教。
相关信息:
使用CLASS12.JAR为JDBC驱动ORACLE8i,该提交的表单共有10个字段。另有2个HIDDEN字段。
回crogers:
关于oracle字符集的问题,恕我才疏,不是很理解,烦请详述。
谢谢你们的回复!
中午时我照lizh的意见做了个测试,发现字段设置为VARCHAR2(4000),最多只允许输入1334个字符(666个汉字),也就是说我们这边ORACLE的字符集里,1个字符是作为3个字节来处理的。
但当我将字段设置为VARCHAR2(2)时,系统允许我输入2个字符或者1个汉字。如此“偏心”,真是气死我了:)
后来我又照lizh的建议把VARCHAR2改成NVARCHAR2,SQL又给我仍EXCEPTION了:character set mismatch. 因为面向数据库的相关对象都是由TORQUE自动生成的,我也糊涂了到哪里去改这个character set.于是又去检查了一下Torque生成类的模板,发现在ORACLE数据库相关的字段定义中,竟然找不到关于NVARCHAR2的定义。只有有VARCHAR2,LONGVARCHAR2(=VARCHAR2(2000)),还有BLOB。
在另一个论坛,有个朋友的回复比较经典:
“这是很经典的OracleJDBC问题。一般直接用ps.setString()设置字符串数据时,Oracle的JDBC驱动会将中文转换为2字节或3字节,不固定的,因此经常会越界。如果你改为ps.setCharacterStream()就是固定的每个中文两个字节 ”。
可问题是,TORQUE里面似乎没给我机会来写什么PrepareStatement,除非改源码。问题看起来似乎更复杂了。
|
BTW,我查过数据库的字符集定义了,两个CHARACTER SET都是一样的 ZHS16GBK 。
应该和STRUTS没什么关系,传递给到STRUTS layer的对象的属性就是String,blob的处理限制在TORQUE里面
TORQUE没用过,查查文档吧