完美解決Informix的中文亂碼問題


完美解決Informix的中文亂碼問題
 Informix是IBM旗下的一款數據庫,要不是這個項目需要,估計這輩子我都不知道居然還有這么一款數據庫。想來公司的項目遍布全國各地,各種部署環境各種應用場景應有盡有,七七八八的問了一大堆的各項目組兄弟,居然都沒人知道這玩意,可見這貨有多小眾化。。。

剛開始接觸這玩意時完全摸不着頭腦,它的設計理念和使用方法太尼瑪詭異了,無論是DB2、Oracle,還是Mysql,居然沒一個對應的開發經驗可以直接套用到Informix上,就是找對應的文檔資料都比其他數據庫要費勁不少,別的不說,光這中文亂碼問題,我也是費了一番功夫才折騰好。

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

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

四個語言環境的含義:

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

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

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

4、服務器處理語言環境— 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;DBDATE=mdy4;IFX_USE_STRENC=TRUE;

這個點也必須強調一下,它的重要性僅次於關鍵點二。在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,否則將顯示亂碼。

總結:

關鍵點二、關鍵點四是解決Informix亂碼問題的重中之重,只要這兩個關鍵點不出問題,中文肯定能夠正常讀寫到數據庫中。另外,需要注意的是,這套解決方案只針對部署在Linux/Unix上的Informix,並且測試有效。一套數據庫,居然部署在Windows服務器上,太掉價了,這種情況完全不予考慮。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM