java與Oracle異常中的亂碼

來源:互聯網
上載者:User

/*
 * 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


可以看到,原來輸出的錯誤資訊是中文的,設定後錯誤資訊為英文的了。這正是你需要的

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.