Informix數據庫的亂碼問題

Informix是IBM旗下的一款數據庫,要不是這個項目須要,估計這輩子我都不知道竟然還有這麼一款數據庫。想來公司的項目遍及全國各地,各類部署環境各類應用場景應有盡有,七七八八的問了一大堆的各項目組兄弟,竟然都沒人知道這玩意,可見這貨有多小衆化。。。

剛開始接觸這玩意時徹底摸不着頭腦,它的設計理念和使用方法太尼瑪詭異了,不管是DB二、Oracle,仍是Mysql,竟然沒一個對應的開發經驗能夠直接套用到Informix上,就是找對應的文檔資料都比其餘數據庫要費勁很多,別的不說,光這中文亂碼問題,我也是費了一番功夫才折騰好。

廢話不說了,解決亂碼過程當中的各類蛋疼暫且按下不表,直奔主題吧,先把本身的心得和解決問題的幾個關鍵點記錄一下:

關鍵點一:正確理解informix數據庫所必須的四個基礎概念。

四個語言環境的含義:

一、客戶機語言環境— Client locale
客戶機語言環境指定客戶機應用程序用於執行讀和寫(I/O)操做的語言、地域和代碼集。
在客戶機應用程序中,I/O 操做包括讀取鍵盤輸入或要發送至數據庫的數據文件,以及將數據庫服務器從數據庫中檢索的數據寫入屏幕、文件或打印機。
經過 CLIENT_LOCALE 來設置客戶機語言環境。

二、數據庫語言環境— Database locale
經過 DB_LOCALE 環境變量設置的數據庫語言環境指定數據庫服務器用於正確解釋特定數據庫中語言環境相關的數據類型(NCHAR 和 NVARCHAR)所需的語言、地域和代碼集。
DB_LOCALE 中指定的代碼集肯定哪些字符在任何字符列中都是有效的,而且肯定數據庫對象(如數據庫、表、列和視圖)的名稱。
數據庫服務器使用 DB_LOCALE 環境變量指定的數據庫代碼集將數據傳入和傳出數據庫。

三、服務器語言環境— Server locale
數據庫服務器使用 SERVER_LOCALE 環境變量指定的服務器代碼集寫文件(如調試和警告文件)。
可是,數據庫服務器不使用服務器語言環境來寫入採用 Informix 專用格式的文件(數據庫和表文件)。

四、服務器處理語言環境— Server processing locale
數據庫服務器使用數據庫語言環境的代碼集做爲服務器處理語言環境的代碼集 , 使用服務器處理語言環境來寫入採用 Informix 專用格式的文件(數據庫和表文件)。
也就是說數據庫服務器使用數據庫語言環境(DB_LOCALE)來寫入採用 Informix 專用格式的文件(數據庫和表文件)。


關鍵點二:引入正確的jdbc jar文件。
jar文件列表以下,jar文件至少須要這10個,缺一不可:
ifxjdbc.jar
ifxjdbc-g.jar
ifxjdbcx.jar
ifxjdbcx-g.jar
ifxlang.jar
ifxlsupp.jar
ifxsqlj.jar
ifxsqlj-g.jar
ifxtools.jar
ifxtools-g.jar

這個關鍵點很是有必要強調一下:理論上來講,讓Informix啓動起來只須要ifxjdbc.jar便可,可是沒有其餘的jar文件,你的中文問題永遠都解決不了!老子當初就是隻引入了必要的五六個jar,到最後怎麼調都調不對這個亂碼,就在這一個點上耗費了絕大部分的時間。

關鍵點三:查看當前系統下全部的數據庫編碼。
select * from sysmaster:sysdbslocale
該語句能夠查詢出當前數據庫中全部database所使用的編碼格式。

關鍵點四:書寫正確的jdbc url。

JDBC URL(UTF-8編碼示例):
jdbc:informix-sqli:6.1.14.38:48101/ccdb2:informixserver=ccdb;NEWCODESET=utf8,8859-1,819;CLIENT_LOCALE=en_US.utf8;DB_LOCALE=en_US.8859-1;

JDBC URL(GBK編碼示例):
jdbc:informix-sqli:6.1.14.38:48101/ccdb2:informixserver=ccdb;NEWCODESET=GB18030-2000,8859-1,819;CLIENT_LOCALE=zh_CN.gb;DB_LOCALE=zh_CN.gb;

這個點也必須強調一下,它的重要性僅次於關鍵點二。在java中,咱們使用的編碼叫UTF-8,但在Informix中,這種編碼格式的正確書寫是utf8,而不是utf-8!另外,GBK編碼在Informix系統下叫作gb或者GB18030-2000,你要是在url中寫成GBK是識別不出來的。


關鍵點五:確認Informix服務器支持UTF-8格式。
使用locale -a 命令,而後檢查是否支持zh_CN.UTF8(注en_US.UTF-8亦可)

關鍵點六:客戶端鏈接工具的編碼調整。
注:使用SecureCRT顯示zh_CN.UTF8字符時,應該當在 會話選項->終端->外觀 精確字體中選擇UTF-8,不然將顯示亂碼。

總結:

關鍵點2、關鍵點四是解決Informix亂碼問題的重中之重,只要這兩個關鍵點不出問題,中文確定可以正常讀寫到數據庫中。另外,須要注意的是,這套解決方案只針對部署在Linux/Unix上的Informix,而且測試有效。一套數據庫,竟然部署在Windows服務器上,太掉價了,這種狀況徹底不予考慮。java

相關文章
相關標籤/搜索