使用Oracle Thin驱动比较麻烦的一个问题是容易出现中文乱码,且Thin驱动不像MySQL驱动那样能在连接字符串中指定编码。 html
最直接的解决方案是对全部数据库中读出的字符串进行编解码,但这么作须要编码处理全部的字符串,很麻烦。 java
// 编码: String newString = new String(oldstring.getBytes(clientEncoding),serverEncoding); // 解码: String newString = new String(oldstring.getBytes(serverEncoding),clientEncoding);
更好的方式是使用JDBC的代理,在经过JDBC返回和写入字符串前进行编解码操做,把全部字符串的处理收拢到一块儿。 git
目前能可靠使用且一直有在维护和开发的JDBC代理有@wenshao的Druid,详情可点击查看,在此很少作介绍。Druid自己实现了Filter-Chain机制,能对JDBC进行灵活的扩展,并内置了一个用于进行字符编码转换的Filter。经过Druid便可很方便的解决Oracle编码问题,无需重复造轮子。 github
使用Druid,须要同时引入Druid和数据库驱动的依赖,Maven配置以下。 数据库
<dependencies> …… <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc14</artifactId> <version>10.2.0.3.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>0.2.13</version> </dependency> …… </dependencies>
配置数据库数据源时(以Spring为例),则需把数据库驱动替换成Druid的,详细说明以下。 apache
<bean id="dataSource" class="org.apache.commons.dbcp.Basic" destroy-method="close"> <!-- Druid的JDBC代理类类名 --> <property name="driverClassName" value="com.alibaba.druid.proxy.DruidDriver" /> <!-- 数据库连接配置 “jdbc:wrap-jdbc:”,为Druid规定的JDBC Proxy连接头 “filters=encoding”,指定了字符编码转化Filter,对应的 “com.alibaba.druid.filter.encoding.EncodingConvertFilter” “jdbc:oracle:thin:@localhost:1521:test”,为原始的Oracle数据库连接 --> <property name="url" value="jdbc:wrap-jdbc:filters=encoding:jdbc:oracle:thin:@localhost:1521:test" /> <property name="username" value="hello" /> <property name="password" value="world" /> <property name="connectionProperties"> <!-- 连接参数配置 “clientEncoding”和“serverEncoding”,分别指定数据库客户端和服务器端的字符编码 Encoding Filter从这两个参数获取编码 --> <value>clientEncoding=GBK;serverEncoding=ISO-8859-1;</value> </property> </bean>
须要注意的是 服务器
使用Druid驱动解决DBeaver连接Oracle乱码,http://my.oschina.net/joshuazhan/blog/122591 oracle