java字符编码和oracle乱码

摘要:
在mysql数据库中,mysql安装的字符集将首先设置为utf-8,然后在连接的jdbc上指示characterEncoding是utf-8。它将一直统一,没有乱码。连接到oracle时出现问题。我使用了已安装的oracle数据库。角色集是美国人,us7ascii。我插入并查询的中文是乱码。字符串str=“Chinese”,str是一个字符串,可以通过str.getBytes()将其编码为字节数组。

编码问题我仍旧没搞懂,最根本的从哪里来就没搞懂。当页面发送请求,编码到后台是什么编码呢?好吧,我默认的都是utf-8.后台接收参数后,可以在控制台打印出来,我也不清楚是什么编码。然后,就是数据库问题。

在mysql数据库,首先会设置mysql安装的字符集为utf-8,然后在连接的jdbc上注明characterEncoding是utf-8.一直这样统一下去,没有出现乱码。

连接oracle就出现问题了,我使用的一个已经安装好的oracle数据库。字符集是American,us7ascii.我插入和查询的中文都是乱码。百度了很久之后,还是进行转码工作。

关于java编码,先看String中的几个方法:

getBytes()

1 byte[] java.lang.String.getBytes(String charsetName) throws UnsupportedEncodingException
2 
3 
4 Encodes this String into a sequence of bytes using the named charset, storing the result into a new byte array. 
5 
6 The behavior of this method when this string cannot be encoded in the given charset is unspecified. The java.nio.charset.CharsetEncoder class should be used when more control over the encoding process is required.

这里先要搞清楚编码(encode)和解码(decode).下面是个人推测,没有考证的解释:

encode:编码,将字符依据某种规则(字符集)解释为一串数字
decode:解码,将一串数字依据某种规则翻译为字符

理解了编码和解码后,从一个字符串开始解析。

字符串str="中文",str是一串字符,通过str.getBytes()可以编码成byte数组。通过new String(bytes)来解码为字符串。下面是测试:

java字符编码和oracle乱码第1张java字符编码和oracle乱码第2张
 1  @Test
 2     public void getEncod() throws UnsupportedEncodingException {
 3         String sysencod = System.getProperty("file.encoding");
 4         System.out.println("系统默认编码:"+sysencod);
 5         String str = "中文";
 6         System.out.println("字符实例:"+str);
 7         System.out.println("===============getbytes无参:===============");
 8         byte[] bytes = str.getBytes();
 9         for (int i = 0; i < bytes.length; i++) {
10             System.out.print(bytes[i]);
11         }
12         System.out.println();
13         System.out.println("通过默认字符集,将字符数组解码为字符:"+new String(bytes));
14         System.out.println("通过utf-8字符集,将字符数组解码为字符:"+new String(bytes,"utf-8"));
15         System.out.println("通过gbk字符集,将字符数组解码为字符:"+new String(bytes,"gbk"));
16         System.out.println("通过iso-8859-1字符集,将字符数组解码为字符:"+new String(bytes,"iso-8859-1"));
17 
18 
19         System.out.println("===============getbytes(utf-8):===============");
20         byte[] bytes2 = str.getBytes("utf-8");
21         for (int i = 0; i < bytes.length; i++) {
22             System.out.print(bytes[i]);
23         }
24         System.out.println();
25         System.out.println("通过默认字符集,将字符数组解码为字符:"+new String(bytes2));
26         System.out.println("通过utf-8字符集,将字符数组解码为字符:"+new String(bytes2,"utf-8"));
27         System.out.println("通过gbk字符集,将字符数组解码为字符:"+new String(bytes2,"gbk"));
28         System.out.println("通过iso-8859-1字符集,将字符数组解码为字符:"+new String(bytes2,"iso-8859-1"));
29         System.out.println("===============getbytes(gbk):===============");
30         byte[] bytes3 = str.getBytes("gbk");
31         for (int i = 0; i < bytes.length; i++) {
32             System.out.print(bytes[i]);
33         }
34         System.out.println();
35         System.out.println("通过默认字符集,将字符数组解码为字符:"+new String(bytes3));
36         System.out.println("通过utf-8字符集,将字符数组解码为字符:"+new String(bytes3,"utf-8"));
37         System.out.println("通过gbk字符集,将字符数组解码为字符:"+new String(bytes3,"gbk"));
38         System.out.println("通过iso-8859-1字符集,将字符数组解码为字符:"+new String(bytes3,"iso-8859-1"));
39         System.out.println("===============getbytes(iso-8859-1):===============");
40         byte[] bytes4 = str.getBytes("iso-8859-1");
41         for (int i = 0; i < bytes.length; i++) {
42             System.out.print(bytes[i]);
43         }
44         System.out.println();
45         System.out.println("通过默认字符集,将字符数组解码为字符:"+new String(bytes4));
46         System.out.println("通过utf-8字符集,将字符数组解码为字符:"+new String(bytes4,"utf-8"));
47         System.out.println("通过gbk字符集,将字符数组解码为字符:"+new String(bytes4,"gbk"));
48         System.out.println("通过iso-8859-1字符集,将字符数组解码为字符:"+new String(bytes4,"iso-8859-1"));
49     }
View Code

结果:

java字符编码和oracle乱码第3张

奇诡的是,虽然getBytes打印的byte数组内容看起来是一样的,但此编码结构却是不同的。并不是一串字符通过某种字符集编码,再解码就可以还原的。这要看该字符是属于何种编码。中文字符只有utf-8和gbk能够存储成功,别的编码会出现漏码像7位编码之类的。而我要解决的就是中文乱码问题。因此,中文编码是关于utf-8和gbk的。

对于存储于oracle的中文字符,采用iso-8859-1.因此,需要考虑的就是utf-8还是gbk转储为iso-8859-1.

经过测试,存储的时候:p=new String(p.getBytes("gbk"),"iso-8859-1");而getBytes("utf-8")失败。

查询结果的时候:result = new String(str.getBytes("ISO-8859-1"),"gbk")可以将oracle的中文正常显示。

附上我用oracle的字符集:

java字符编码和oracle乱码第4张

免责声明:文章转载自《java字符编码和oracle乱码》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇负载均衡和冗余技术Oracle内部错误:ORA00600:[6033]一例下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

oracle创建表空间 扩展表空间文件 修改表空间自动增长

  1. 创建表空间 create tablespace SIRM2  datafile 'D:oracleproduct10.2.0oradataorclSIRM2.dbf' size 1024M --存储地址 初始大小1G autoextend on next 10M maxsize unlimited   --每次扩展10M,无限制扩展 EXTENT...

oracle--10安装问题

01,ins_ctx.mk INFO: make: *** [ctxhx] Error 1 INFO: End output from spawned process. INFO: ---------------------------------- INFO: Exception thrown from action: make Exception N...

_tcsrchr 规格严格

_tcsrchr #include <afx.h> 查找字符串中某个字符最后一次出现的位置 两个参数 第一个参数:字符串 第二个参数:查找的字符 返回值:指向最后一次在字符串中出现的该字符的指针,如果要查找的字符再串中没有出现,则返回NULL。 TCHAR szConfFile[MAX_PATH];::GetModuleFileName(...

Oracle 11g RAC INS06006 Passwordless SSH connectivity not set up between the following node(s) 解决方法

一.问题描述        在VBox 上安装Oracle 11.2.0.1 的RAC, 在SSH 配置时报错: INS-06006: Passwordless SSHconnectivity not set up between the following node(s)   注意: 这里奇怪的表现是我们setup是成功,仅仅是Test 失败。 二...

转:oracle常见重要视图-v$sql,v$sql_plan,v$sqltext,v$sqlarea,v$sql_plan_statistcs

v$sqlV$SQL中存储具体的SQL语句。 一条语句可以映射多个cursor,因为对象所指的cursor可以有不同用户(如例1)。如果有多个cursor(子游标)存在,在V$SQLAREA为所有cursor提供集合信息。 例1: 这里介绍以下child cursor user A: select * from tbl user B: select * f...

【学习】java下实现调用oracle的存储过程和函数

在oracle下创建一个test的账户,然后按一下步骤执行: 1.创建表:STOCK_PRICES View Code--创建表格CREATETABLE STOCK_PRICES( RIC VARCHAR(6) PRIMARYKEY, PRICE NUMBER(7,2), UPDATED DATE ); 2.插入测试数据: View...