使用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