怎么解决JDBC读ORACLE的乱码问题

9441 2006-09-11 02:33:50
ORACLE的字符集为US7ASCII,用ORACLE JDBC读的时候会有乱码,请问如何解决?

我知道可以用转码方式来解决new String(rs.getString("name").getBytes("ISO8859-1"),"GBK");
但比较烦,有没有其他的更好的方式来解决这个问题?不需转码?

数据库ORACLE的字符集不能转换,上面还有其他的应用。
...全文
894 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
ypekk 2006-09-28
  • 打赏
  • 举报
回复
方法一:在提交的 form 中设置 enctype="multipart/form-data" 属性
方法二:String name = request.getParemeter("name"); //取得姓名字段
name = new String(name.getBytes("ISO8859-1","gbk")); //转一下码,可以单步看
一下是不是中文。

另外,方法一和方法二不要同时用,否则会转两次码。。
freedom2001 2006-09-28
  • 打赏
  • 举报
回复
trim是去空格的怎么拿到这来了.
US7ASCII又见这个字符集,如果是新版本的oracle安装的时候用默认的字符集就可以。这个字符集是一个很小的子集。不要偷懒了就写个转码函数调用吧.你数据库不能改,上面还有别的应用,就只能在中间做文章了,不实际写代码是行不通的
eagleking012 2006-09-28
  • 打赏
  • 举报
回复
可以参考一下这个
CREATE TYPE num_varray AS VARRAY(10) OF VARCHAR2(12)
/
CREATE TABLE varray_table (col1 num_varray);
INSERT INTO varray_table VALUES (num_varray('你好', 'abc'));

select * from varray_table;

*/

import java.sql.*;
import java.math.*;
import oracle.jdbc.driver.*;
import oracle.sql.*;

class Array1
{

public static void main(String args[]) throws Exception
{
int oracleId = CharacterSet.ZHS16GBK_CHARSET;
CharacterSet dbCharset = CharacterSet.make(oracleId);

DriverManager.registerDriver
(new oracle.jdbc.driver.OracleDriver());

Connection conn =
DriverManager.getConnection
("jdbc:oracle:thin:@10.9.200.58:1521:db01",
"mytest",
"mytest");

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery("SELECT * FROM varray_table");

while (rs.next()) {
ARRAY my_array = ((OracleResultSet)rs).getARRAY(1);

// return the SQL type names, integer codes,
// and lengths of the columns
System.out.println ("Array is of type " + my_array.getSQLTypeName());
System.out.println ("Array element is of typecode " + my_array.getBaseType());
System.out.println ("Array is of length " + my_array.length());

// get Array elements
String[] values = (String[]) my_array.getArray();
for (int i = 0; i < values.length; i++)
{
oracle.sql.CHAR out_value = new oracle.sql.CHAR(values[i], dbCharset);
System.out.println(">> index " + i + " = " + out_value);
}


}

rs.close();
stmt.close();
conn.close();
}
}
gongzhy 2006-09-28
  • 打赏
  • 举报
回复
好贴子,学习,顶
9441 2006-09-28
  • 打赏
  • 举报
回复
LS的意思是什么?怎么不明白
jordanboss 2006-09-21
  • 打赏
  • 举报
回复
在SQL语句上的字段名叫TRIM吧
如 select trim(emp_name) from emp
9441 2006-09-21
  • 打赏
  • 举报
回复
little06(火) ( )

ORACLE的JDBC可没有设定字符集的参数
Sunny319 2006-09-20
  • 打赏
  • 举报
回复
学习!
常遇道 2006-09-20
  • 打赏
  • 举报
回复
写过转码的方法,然后调用它就可以了.
little06 2006-09-13
  • 打赏
  • 举报
回复
url=jdbc:mysql://localhost:3306/aa?user=root&password=root&useUnicode=true&characterEncoding=GBK

试一试在连接的时候直接设置
从不签到 2006-09-12
  • 打赏
  • 举报
回复
<% @ page contentType="text/html;charset = gb2132" %>
在页面中比如
String name = request.getParemeter("name");
name = new String(name.getBytes("ISO8859-1","gb2132"));
mrdangdong 2006-09-12
  • 打赏
  • 举报
回复
先写过滤器,再ora_US7ASCII.reg
zuguanqun 2006-09-12
  • 打赏
  • 举报
回复
写个过滤器
TinyJimmy 2006-09-12
  • 打赏
  • 举报
回复
不知道你做什么应用, 按理说方法一应该可以, 偶都用了好多年了. 由于平台关系, 直接System.out.println测试不出东西来的, 需要用文件I/O看看
9441 2006-09-12
  • 打赏
  • 举报
回复
回楼上的,

第一种方法试过了,还是乱码,不管用

第二种方法太烦,我还要用HIBERNATE之类的持久层就不好办了
TinyJimmy 2006-09-12
  • 打赏
  • 举报
回复
不知道除了操作Oracle还有没有其他的操作应用会影响编码, 给两个方案你参考

1. 将编译/运行的编码设置成与Oracle一样的编码.
编译.java文件 javac -encoding ISO8859-1 ...
运行 java -Dfile.encoding=ISO8859-1
注意: 如果你的应用设计到JSP/文件I/O, 相应的要使用ISO8859-1, 如果大量这样的I/O, 这样的方法不好用.

2. 使用自己写的JDBC包装器代替Oracle的ResultSet/Statement...
原理是在包装器内部实现编码转换, 而应用就不需要每个字段转一次了.
注意: 需要包装的东西包括Connection, Statement, CallableStatment, PreparedStatement, ResultSet 如果用到JDBC2.0, 还要包装DataSource. 包装比较简单, 但向下兼容差, 如Jdk1.3 包装后, jdk1.4还要重新包装一次, 比较繁琐.
xokao 2006-09-11
  • 打赏
  • 举报
回复
你可以自己写一个setEncodingCharactar,然后在web里配置每次读数据的时候执行转换就是
vacuumboy 2006-09-11
  • 打赏
  • 举报
回复
既然数据库的字符集不能改变,那就在后台写一个转码的函数,每次查询后就用函数转一次,想不出有其他更好的方法
kinsey0514 2006-09-11
  • 打赏
  • 举报
回复
我用的SQL SERVER 2000 帮不上什么忙罗
这里有个乱码讨论帖子
你可以看一下
http://community.csdn.net/Expert/topic/5004/5004961.xml?temp=.6147882
由于历史的原因,早期的oracle没有中文字符集(如oracle6、oracle7、oracle7.1),但有的用户从那时起就使用数据库了, 并用US7ASCII字符集存储了中文,或是有的用户在创建数据库时,不考虑清楚,随意选择一个默认的字符集,如WE8ISO8859P1或US7ASCII,而这两个字符集都没有汉字编码,虽然有些时候选用这种字符集好象也能正常使用,但用这种字符集存储汉字信息从原则上说就是错误的,它会给数据库的使用与维护带来一系列的麻烦。正常情况下,要将汉字存入数据库,数据库字符集必须支持中文,而将数据库字符集设置为US7ASCII等单字节字符集是不合适的。US7ASCII字符集只定义了128个符号,并不支持汉字。另外,如果在SQL*PLUS中能够输入中文,操作系统缺省应该是支持中文的,但如果在NLS_LANG中的字符集设置为US7ASCII,显然也是不正确的,它没有反映客户端的实际情况。但在实际应用中汉字显示却是正确的,这主要是因为Oracle检查数据库与客户端的字符集设置是同样的,那么数据在客户与数据库之间的存取过程中将不发生任何转换,但是这实际上导致了数据库标识的字符集与实际存入的内容是不相符的。而在SELECT的过程中,Oracle同样检查发现数据库与客户端的字符集设置是相同的,所以它也将存入的内容原封不动地传送到客户端,而客户端操作系统识别出这是汉字编码所以能够正确显示。

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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