jdbc操作非中文字符集oracle資料庫導致的中文字元讀寫亂碼的解決方案
阿新 • • 發佈:2019-02-11
oracle資料庫向來是一個麻煩的資料庫,要不它的DBA怎麼就那麼值錢呢,呵呵。
中文的亂碼問題也是一個比較頭疼的問題,在odbc的連線中,可以通過設定客戶端的字符集(修改登錄檔)來解決中
文問題。而通過jdbc 的thin方式來連線資料庫,就沒那麼容易了。如果資料庫使用的是非中文字符集,往往在處理中
文問題的時候就很頭疼。之所以頭疼,是因為oracle的驅動沒有提供字符集的設定引數,所以在實際使用過程中,程
序系統和資料庫系統中字符集不一致的時候,就會帶來亂碼問題。
通常的做法有兩種:
第一種是在程式中,針對中文字元做顯式的字符集轉換。這種方式是頗不得已而為之的方法,相信大家遇到過很多次
了。
第二種是hack oracle的驅動程式,在底層直接解決,通過給url加字符集引數,然後在驅動底層進行解析,在涉及
String型別操作的地方,在源字符集和目的字符集做相應轉換。這中做法,雖然一勞永逸,但是需要比較深的功力。
另外,反編譯別人的程式碼再做修改,也許不太好吧。不過話又說回來,oracle無情,也不要別怪人無義,^_^。mysql
、sybase、sql server的驅動都提供了字符集的設定引數,為什麼單單oracle沒有呢?
所以,對一、二兩種辦法做個折中,應該是比較好的方案。具體的辦法可以如下:
針對oracle驅動呼叫,做一個代理,需要對ResultSet、Statement、PreparedStatement等介面,在有字串操作方法的地方,對字符集進行轉換。另外,sql中有中文字元,也是需要處理的。
這樣,既不要每次都寫程式轉換,解決一勞永逸的問題,還不影響原有的oracle驅動程式。
中文的亂碼問題也是一個比較頭疼的問題,在odbc的連線中,可以通過設定客戶端的字符集(修改登錄檔)來解決中
文問題。而通過jdbc 的thin方式來連線資料庫,就沒那麼容易了。如果資料庫使用的是非中文字符集,往往在處理中
文問題的時候就很頭疼。之所以頭疼,是因為oracle的驅動沒有提供字符集的設定引數,所以在實際使用過程中,程
序系統和資料庫系統中字符集不一致的時候,就會帶來亂碼問題。
通常的做法有兩種:
第一種是在程式中,針對中文字元做顯式的字符集轉換。這種方式是頗不得已而為之的方法,相信大家遇到過很多次
了。
第二種是hack oracle的驅動程式,在底層直接解決,通過給url加字符集引數,然後在驅動底層進行解析,在涉及
String型別操作的地方,在源字符集和目的字符集做相應轉換。這中做法,雖然一勞永逸,但是需要比較深的功力。
另外,反編譯別人的程式碼再做修改,也許不太好吧。不過話又說回來,oracle無情,也不要別怪人無義,^_^。mysql
、sybase、sql server的驅動都提供了字符集的設定引數,為什麼單單oracle沒有呢?
所以,對一、二兩種辦法做個折中,應該是比較好的方案。具體的辦法可以如下:
針對oracle驅動呼叫,做一個代理,需要對ResultSet、Statement、PreparedStatement等介面,在有字串操作方法的地方,對字符集進行轉換。另外,sql中有中文字元,也是需要處理的。
這樣,既不要每次都寫程式轉換,解決一勞永逸的問題,還不影響原有的oracle驅動程式。