使用Druid解決Oracle Thin驅動中文亂碼

1. 問題

使用Oracle Thin驅動比較麻煩的一個問題是容易出現中文亂碼,且Thin驅動不像MySQL驅動那樣能在連接字符串中指定編碼。 html

2. 思路

最直接的解決方案是對全部數據庫中讀出的字符串進行編解碼,但這麼作須要編碼處理全部的字符串,很麻煩。 java

// 編碼:
String newString = new String(oldstring.getBytes(clientEncoding),serverEncoding);
// 解碼:
String newString = new String(oldstring.getBytes(serverEncoding),clientEncoding);

更好的方式是使用JDBC的代理,在經過JDBC返回和寫入字符串前進行編解碼操做,把全部字符串的處理收攏到一塊兒。 git

3. 解決

目前能可靠使用且一直有在維護和開發的JDBC代理有@wenshaoDruid,詳情可點擊查看,在此很少作介紹。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> 

須要注意的是 服務器

  1. 數據庫連接配置的順序有前後要求,不能顛倒,詳細要求請參看其源碼,位於DruidDriver類的parseConfig方法;
  2. Druid能經過數據庫連接自動識別數據庫,因此無需在配置中指定(也可在「jdbc:wrap-jdbc:」後加上「driver=oracle.jdbc.driver.OracleDriver」顯示指定),代碼參看JdbcUtils類的getDbType方法;
  3. connectionProperties的配置最好在一行內且去除無用頭尾空格,不然DataSource在解析配置時容易產生錯誤

4. 參考

  1. http://4ucode.com/Study/Topic/1151903
  2. http://www.blogjava.net/ghostdog/archive/2008/11/04/207058.html
  3. https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98

5. 示例

使用Druid驅動解決DBeaver連接Oracle亂碼,http://my.oschina.net/joshuazhan/blog/122591 oracle

相關文章
相關標籤/搜索