Jdbc连接oracle远程数据库字符集US7ASCII中文乱码解决

一、环境描述

数据库:oracle11g 字符集:AMERICAN_AMERICA.US7ASCII
查询字符集sql语句:

select userenv('language') from dual;

JDK1.8
oracle驱动包

<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc</artifactId>
    <version>6</version>
</dependency>

二、问题描述

因为程序代码本身的编码是utf-8,使用jdbc连接查询oracle数据库表数据中文乱码,plsql设置环境变量NLS_LANG=AMERICAN_AMERICA.US7ASCII 是能解决plsql显示正常,但是程序使用jdbc连接数据库还是乱码。

三、解决方案

直接上代码:

package com.joe.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.*;

/**
 * @author joe
 * @Title: ascii字符集
 * @Description:
 * @date 2022/9/3014:37
 */
public class Test_ACSII_Oracle {

    static {
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    //定义数据库连接地址
    public static final String DBURL = "jdbc:wrap-jdbc:filters=encoding:jdbc:oracle:thin:@//192.168.0.233:1521/helowin";
    public static final String DBUSER = "test";
    public static final String DBPASS = "123456";
    public static void main(String[] agrs) throws Exception{
        String sql = "select code,fee_type from t_fee_type";

        Properties props = new Properties();
        props.setProperty("serverEncoding","ISO-8859-1");
        props.setProperty("clientEncoding","GBK");
        props.put("user", DBUSER);
        props.put("password", DBPASS);
        Connection conn = (Connection) DriverManager.getConnection(DBURL,props);
        PreparedStatement ps = (PreparedStatement)conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE);
        //Statement stmt = conn.createStatement();
        //ps.setNString(1,"病程记录");
        ResultSet rs = ps.executeQuery();
        List<Map<String, Object>> mapList = print(rs);
        for (Map<String, Object> objectMap : mapList) {
            System.out.println(objectMap);
        }
        //关闭资源
        if(rs!=null){rs.close();}
        if(ps!=null){ps.close();}
        if(conn!=null){conn.close();}
    }

    public static List<Map<String,Object>> print(ResultSet rs)throws Exception{
        int rowCount = 0;
        long begin = System.currentTimeMillis();
        List<Map<String,Object>> list = new ArrayList<>();
        while (rs.next()){
            rowCount++;
            Map<String,Object> map = new HashMap<>();
            //获取数据
            map.put("code",rs.getString(1));
            //map.put("fee_type2",new String(rs.getString("fee_type").getBytes("ISO-8859-1"),"GBK"));
            map.put("fee_type3",rs.getString(2));
            list.add(map);
        }
        long end = System.currentTimeMillis();
        System.out.println("总共行数:"+rowCount);
        System.out.println("耗时:"+ (end-begin)/1000+"秒");
        return list;
    }

}

在这里插入图片描述
核心改造:
1、配置服务端编码和客户端编码

Properties props = new Properties();
props.setProperty("serverEncoding","ISO-8859-1");
props.setProperty("clientEncoding","GBK");

2、url

jdbc:wrap-jdbc:filters=encoding:
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值