java与Oracle异常中的乱码

/*
 * Test.java 2008-7-30
 *
 */
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;

import oracle.jdbc.OracleDriver;

public class Test {
    public static void main(String[] args) throws Exception {
        DriverManager.registerDriver(new OracleDriver());
       
        // 正常
        Connection conn = getConnection();
        ResultSet rs = conn.createStatement().executeQuery(
                app2db("SELECT '123abc我是谁?' FROM DUAL"));
        rs.next();
        // 打印123abc我是谁?
        System.out.println(db2app(rs.getString(1)));
       
        // 异常
        // 因该打印ORA-00921: unexpected end of SQL command
        // 结果打印ORA-00921: ???? SQL ????
        try {
            conn.createStatement().executeQuery("SELECT 1 FROM DUAL WHERE");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        // 因该打印ORA-00920: invalid relational operator
        // 结果打印ORA-00920: ????????
        try {
            conn.createStatement().executeQuery("SELECT 1 FROM DUAL WHERE 1");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        // 因该打印ORA-00904: "X": invalid identifier
        // 结果打印ORA-00904: "X": ??????
        try {
            conn.createStatement().executeQuery("SELECT x FROM x");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    private static String app2db(String str) throws Exception {
        return new String(str.getBytes(), "ISO-8859-1");
    }

    private static String db2app(String str) throws Exception {
        return new String(str.getBytes("ISO-8859-1"));
    }

    private static Connection getConnection() throws Exception {
        return DriverManager.getConnection("jdbc:oracle:thin:......");
    }
}

解决方法:

你可以考虑设置Oracle客户端所在的机器(也是你的应用程序运行的机器)的NLS_LANG环境变量来绕开这个问题

我在自己的机器上做了个测试,效果如下:

系统环境

Windows 2003简体中文版,Oracle 10g

操作步骤

1.执行cmd.exe开启一个命令行窗口
2.执行sqlplus username/password进入SQL Plus命令提示符
3.执行如下SQL语句
Sql代码
select 'x' from dua; 

select 'x' from dua;
注意dua是我故意写错的(dual少了其中的l),以便得到一个oracle异常
这时可以看到错误信息如下:

引用
第 1 行出现错误:
ORA-00942: 表或视图不存在

4.执行quit退出SQL Plus命令提示符
5.在操作系统命令行提示符执行如下命令
Java代码
set nls_lang=AMERICAN_AMERICA.WE8ISO8859P1 

set nls_lang=AMERICAN_AMERICA.WE8ISO8859P1
6.重复第2、3步骤
这时可以看到错误信息如下:

引用
ERROR at line 1:
ORA-00942: table or view does not exist

可以看到,原来输出的错误信息是中文的,设置后错误信息为英文的了。这正是你需要的

时间: 2024-10-22 07:54:56

java与Oracle异常中的乱码的相关文章

Oracle 8i中字符集乱码问题析及其解决办法

一.问题描述 SQL Plus WorkSheet是一个窗口图形界面的SQL语句编辑器,对于那些喜欢窗口界面而不喜欢字符界面 的用户,该工具相对SQL/PLUS受到了很大的欢迎.但从Oracle 8i以后,如果安装Oracle 8i时选取的是别 于英语的字符集,对于我们中国,通常会选取简体中文字符集(ZHS16GBK),安装成功后,运行SQL Plus WorkSheet程序,会出现所有的中文显示以及查询结果均为乱码的情况. 二.问题分析 最初出现该问题,首先怀疑就是安装时字符集设置有问题,也就

使用java操作Oracle数据库中的CLOB数据类型

字段类型:blob,clob,nclob 说明:三种大型对象(LOB),用来保存较大的图形文件或带格式的文本文件,如Miceosoft Word文档,以及音频.视频等非文本文件,最大长度是4GB.LOB有几种类型,取决于你使用的字节的类型,Oracle 8i实实在在地将这些数据存储在数据库内部保存.可以执行我们所操作的clobtest_table中属性是(字符型id,CLOB型picstr),目前我们假设一个大的字符对象str已经包含了我们需要存入picstr字段的数据.而且connection

Java Web开发项目中中文乱码解决方法汇总_java

Java Web项目中,解决中文乱码方法总结如下 第一种情况:调用jsp页面中文显示乱码问题描述:通过浏览器调用jsp页面,在浏览器中显示的中文内容出现乱码. 解决方法:首先确认本jsp在编辑器中保存文件内容时,使用的是utf-8的编码格式,然后在jsp页面的开始处添加<%@ pageEncoding="utf-8"%>就可以解决这种中文乱码问题 第二种情况:调用servlet页面显示乱码问题描述:通过浏览器调用servlet,servlet在浏览器中显示的内容出现乱码.

关于java判断oracle中的表是否存在,不存在则创建一个表的问题

问题描述 关于java判断oracle中的表是否存在,不存在则创建一个表的问题 代码如下try{ Class.forName(""oracle.jdbc.driver.OracleDriver""); String url = ""jdbc:oracle:thin:@""+localhost+"":""+port+"":""+dbname; con

asp.net查出oracle数据库中的中文乱码问题

把这两天两次安装IBM2650服务器中出现的问题做一个总结: 1.第一次安装,用IBM的引导盘引导,按步就班的下来,选择语言,做Raid5,选择windows系统等等 .安装好windows2003企业版之后,再去安装oracle时,安装到一半时,提示不能创建快捷方式.取消, 再安装还是不能创建快捷方式,就那样安装上了.安装之后oracle运行倒也正常,导入数据,发现中文 变成了乱码.再安装editplus和winrar发现显示窗口的中文也是乱码,右键菜单上的部分中文是乱码. 在网上搜了一下,原

关于ORACLE数据库中汉字显示乱码

  1 引言 ORACLE数据库作为业界领先的数据库产品,近年来在国内大中型企业中得到了广泛的应用.虽然ORACLE数据库产品本身在本地化方面已做得相当成熟,但还是有不少用户反应汉字显示乱码的问题.如对同一数据库不同的用户对同一表中的username查询却得出了不同的结果: "ORACLE??????"和"ORACLE中国有限公司",显然结果中将中文字符显示为乱码,那么为什么呢?字符集的设置不当是影响ORACLE数据库汉字显示的关键问题. 2 关于字符集 字符集是O

java在一个主线程中开了很多小线程,当主程异常后,希望能关闭这些服务用的小线程,以免冲突。该怎么做

问题描述 java在一个主线程中开了很多小线程,当主程异常后,希望能关闭这些服务用的小线程,以免冲突.该怎么做 我是这样写的: thread mainThread(){ while(true){ init; try{ new serverThread1; ... new serverThread2; ... ... }catch(e){ ... if(flag_exit)break; ... } } } 通常,这个主线程会经常遇问题,所以会抛出异常,因为有while(true),它会从头开始运行

HashMap中java.lang.NullPointerException异常问题

问题描述 //添加根结点Iterator<String>Iter=resultMap.keySet().iterator();inti=0;while(Iter.hasNext()){i++;System.out.println(i);StringscCode=Iter.next();if(resultMap.get(Iter.next())!=null){StringscParent=resultMap.get(Iter.next()).toString();System.out.print

java如何实现远程备份与还原ORACLE数据库中的表

问题描述 java如何实现远程备份与还原ORACLE数据库中的表 本地没有装ORACLE数据库,项目是B/S模式的,想在页面加上两个按钮"备份数据","还原数据" 每台客户端不可能都装ORACLE数据库 解决方案 在应用服务器端装个oracle客户端,然后用java的外部命令调用方式.解决方案二:如果是个别业务表的数据需要备份和还原可以自己写个导出.导入的功能.(导出的数据可以组织成有格式的文本或者XML)如果是全部表的备份和还原,建议还是人工用命令去操作好.解决方