2013-05-02 803 views
1

我們有PHP服務器代碼,針對我們的iSeries中型系統執行SQL語句。PHP/SQL - 將EBCDIC轉換爲ASCII

下面是SQL查詢的簡化版本

SELECT 'Regular' "sales_type", sum(sales_type1) "sales" FROM salesTable 

執行查詢就好了,問題是,使用靜態字段/值,如「SomeText」「標題」和結果時在PHP回來,他們不是想要的格式

string(7) "م�����" 

要連接到系統和檢索結果

db2_connect ('*LOCAL', 'user', 'pass'); 
if (! $connection) {[error code]} 
$stmt = db2_prepare ($connection, $strSql); 
if (! db2_execute ($stmt)) { [error code ] 
while ($row = db2_fetch_array ($stmt)) { 
    var_dump($row[1]); 
} 

我們對PHP版本5.2.17

我們的iSeries是V7R1M0

到服務器端轉換與PHP或SQL查詢自身將是巨大的一個解決方案。

謝謝!


編輯

從雄鹿隊的建議,我們已經改變了用戶配置文件CCSID到65535 37代替

現在我們回到(下圖)這是一個有點接近...

string(7) "Ù…‡¤「™" 

這可能是因爲我們只改變了用戶?系統,工作或表格是否需要更改?


編輯2

這裏是輸出的phpinfo

_COOKIE["ZDEDebuggerPresent"] php,phtml,php3 
_SERVER["ZendEnablerConfig"] /www/zendserver/conf/fastcgi.conf 
_SERVER["PHPRC"] /usr/local/ZendSvr/etc/ 
_SERVER["PHP_FCGI_CHILDREN"] 40 
_SERVER["PHP_FCGI_MAX_REQUESTS"] 0 
_SERVER["CCSID"] 819 
_SERVER["LANG"] C 
_SERVER["INSTALLATION_UID"] 20101203131436121338 
_SERVER["LDR_CNTRL"] MAXDATA=0x40000000 
_SERVER["LIBPATH"] /usr/local/ZendSvr/lib 
_SERVER["DB2NOEXITLIST"] TRUE 
_SERVER["ORACLE_HOME"] . 
_SERVER["ORA_NLS10"] no value 
_SERVER["ORA_NLS_PROFILE33"] no value 
_SERVER["FCGI_ROLE"] RESPONDER 
_SERVER["REDIRECT_UNIQUE_ID"] [email protected] 
_SERVER["REDIRECT_STATUS"] 200 
_SERVER["UNIQUE_ID"] [email protected] 
_SERVER["QIBM_USE_DESCRIPTOR_STDIO"] Y 
_SERVER["HTTP_HOST"] vmas400.vm.com:10090 
_SERVER["HTTP_CONNECTION"] keep-alive 
_SERVER["HTTP_X_REQUESTED_WITH"] XMLHttpRequest 
_SERVER["HTTP_USER_AGENT"] Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31 
_SERVER["CONTENT_TYPE"] application/x-www-form-urlencoded 
_SERVER["HTTP_ACCEPT"] */* 
_SERVER["REFERER"] http://vmas400.vm.com:10090ZendServer/Index/Index 
_SERVER["HTTP_REFERER"] http://vmas400.vm.com:10090/ZendServer/Index/Index 
_SERVER["REFERER_URL"] http://vmas400.vm.com:10090/ZendServer/Index/Index 
_SERVER["HTTP_ACCEPT_ENCODING"] gzip,deflate,sdch 
_SERVER["HTTP_ACCEPT_LANGUAGE"] en-US,en;q=0.8 
_SERVER["HTTP_ACCEPT_CHARSET"] ISO-8859-1,utf-8;q=0.7,*;q=0.3 
_SERVER["HTTP_COOKIE"] ZENDSERVERSESSID=7asfv608qffhv556msem6evi66; CosmeticContest=16062; CompanyWithStoreDetail=16061; TYLYClassAnalysis=16068; OrderDetail=17220; RmsOrders=17221; DailyReceipts=16063; DailySales=17562; OnOrder=16064; OpenPurchaseOrders=17566; RegularPriceRankings=17568; ReviewStatistics=17570; SalesAndStock=17573; StocksByPeriod=17575; Top10BestSellers=17577; ReplenishmentAssortment=17269; RABS=17616; FreeFormatSku=16473; TYLYSalesAndOH=21294; SalesRecapByDate=16312; VendorAgendaSummary=23219; BasicStock=23474; InStock=16067; RegSalesAvgStockSummary=21270; TYLYSalesMDGMByStore=23822; VendorAgenda=23826; Header=16066; usc=adam; hudi[u]=d106b7a04c0d94b8a0e7624a017ead98324b57e8; hudi[i]=fec51923e58c84db4647d2b3e11fe03ec3f0c202; FreeFormat=16506; __utma=118969486.352613215.1355776933.1365626094.1367348033.12; __utmz=118969486.1355776933.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); ZDEDebuggerPresent=php,phtml,php3 
_SERVER["PATH"] /bin:/usr/bin:/usr/ucb:/usr/bsd:/usr/local/bin 
_SERVER["SERVER_SIGNATURE"] no value 
_SERVER["SERVER_SOFTWARE"] Apache 
_SERVER["SERVER_NAME"] vmas400.vm.com 
_SERVER["SERVER_ADDR"] 192.168.1.2 
_SERVER["SERVER_PORT"] 80 
_SERVER["REMOTE_ADDR"] 172.16.129.193 
_SERVER["DOCUMENT_ROOT"] /www/zendserver/htdocs/prod 
_SERVER["SERVER_ADMIN"] [no address given] 
_SERVER["SCRIPT_FILENAME"] /usr/local/zendsvr/gui/html/index.php 
_SERVER["DOCUMENT_NAME"] /usr/local/zendsvr/gui/html/index.php 
_SERVER["REMOTE_PORT"] 14259 
_SERVER["REDIRECT_QUERY_STRING"] dojo.preventCache=1367519066445 
_SERVER["REDIRECT_URL"] /ZendServer/Information/Phpinfo 
_SERVER["GATEWAY_INTERFACE"] CGI/1.1 
_SERVER["SERVER_PROTOCOL"] HTTP/1.1 
_SERVER["REQUEST_METHOD"] GET 
_SERVER["QUERY_STRING"] dojo.preventCache=1367519066445 
_SERVER["REQUEST_URI"] /ZendServer/Information/Phpinfo?dojo.preventCache=1367519066445 
_SERVER["SCRIPT_NAME"] /ZendServer/index.php 
_SERVER["DOCUMENT_URI"] /ZendServer/index.php 
_SERVER["RULE_FILE"] conf/httpd.conf 
_SERVER["PHP_SELF"] /ZendServer/index.php 
_SERVER["REQUEST_TIME"] 1367519066 

EDIT

SOLUTION

解決方案是將用戶配置文件更改爲使用CCSID 37,並將服務器作業更改爲使用CCSID 37.我們將進行手動更改,以便在作業重新啓動時不會恢復。

回答

3

如果IBM方面配置正確,轉換會自動發生。 IBM管理員檢查系統值QCCSID。如果它設置爲65535,那就是沒有翻譯發生的原因。 65535表示系統上的所有數據都是二進制的,不應該被翻譯。有一個CCSID的層次結構。它在QCCSID系統級開始,向下移動到用戶配置文件,最後移動到單個表。這是爲了處理使用多種語言的系統。

主要原因系統是在65535是因爲:如果電流端機器的遙遠祖先被部署,有一個單一的語言;一個EBCDIC,並且在引入多種語言時,默認語言被設置爲「不翻譯」。

EBCDIC不再是單個字符集。每種語言都有一種編碼。美國英語是CCSID(37)。如果事實證明CCSID是問題,請讓管理員用適當的CCSID創建一個測試用戶配置文件並嘗試。

編輯1:我只是做了我的機器上測試。

編輯2:添加文字到返回的列。

<?php 
    //Establish connection to database 
    $host = "midrange"; 
    $conn = db2_connect ($host, user, pass); 
?> 

<table width="75%" border="1" cellspacing="1" cellpadding="1" bgcolor="#eeeeee"> 
<tr> 
    <td><b>Name</b></td> 
    <td><b>Email</b></td> 
    <td><b>3rd column</b></td> 
</tr> 

<?php 
$query = 'Select name, email, \'Markdown\' "THIRD" from table'; 

//Execute query 
$queryexe = db2_exec($conn, $query) ; 

//Fetch results 
while(db2_fetch_row($queryexe)) { 
$name = db2_result($queryexe, 'NAME'); 
$email = db2_result($queryexe, 'EMAIL'); 
$const = db2_result($queryexe, 'THIRD'); 

//Put the results in an HTML table. 
print("<tr bgcolor=#ffffff>\n"); 
print("<td>$name</td>\n"); 
print("<td>$email</td>\n"); 
print("<td>$const</td>\n"); 
print("</tr>\n"); 
} 
?> 
</table> 

我所有的表格都是CCSID(37)IBM i 7.1。
phpinfo()報告IBM_DB2 1.9.0,PHP 5.3.3我注意到我啓用了iconv支持,並且我的服務器CCSID是819 - US ASCII。

編輯3:很偏的phpinfo()

ibm_db2 
IBM DB2, Cloudscape and Apache Derby support enabled 
Module release 1.9.0 
Module revision  $Revision: 297218 $ 
Binary data mode (ibm_db2.binmode) DB2_BINARY 
DB2 instance name (ibm_db2.instance_name) no value 

iconv 
iconv support enabled 
iconv implementation IBM iconv 
iconv library version unknown 

Directive Local Value Master Value 
iconv.input_encoding ISO8859-1 ISO8859-1 
iconv.internal_encoding ISO8859-1 ISO8859-1 
iconv.output_encoding ISO8859-1 ISO8859-1 
Environment 
Variable Value 
ZendEnablerConfig /www/zendsvr/conf/fastcgi.conf 
PHPRC /usr/local/ZendSvr/etc/ 
PHP_FCGI_CHILDREN 5 
PHP_FCGI_MAX_REQUESTS 0 
CCSID 819 
LANG en_US 
INSTALLATION_UID 20101215125734236656 
LIBPATH  /usr/local/ZendSvr/lib 
DB2NOEXITLIST TRUE 

PHP Variables 
Variable Value 
_REQUEST["TJE"] no value 
_REQUEST["TE3"] no value 
_REQUEST["ZDEDebuggerPresent"] php,phtml,php3 
_COOKIE["TJE"] no value 
_COOKIE["TE3"] no value 
_COOKIE["ZDEDebuggerPresent"] php,phtml,php3 
_SERVER["ZendEnablerConfig"] /www/zendsvr/conf/fastcgi.conf 
_SERVER["PHPRC"] /usr/local/ZendSvr/etc/ 
_SERVER["PHP_FCGI_CHILDREN"] 5 
_SERVER["PHP_FCGI_MAX_REQUESTS"] 0 
_SERVER["CCSID"] 819 
_SERVER["LANG"] en_US 
_SERVER["INSTALLATION_UID"] 20101215125734236656 
_SERVER["LIBPATH"] /usr/local/ZendSvr/lib 
_SERVER["DB2NOEXITLIST"] TRUE 
_SERVER["FCGI_ROLE"] RESPONDER 
_SERVER["SCRIPT_URL"] /hello.php 
_SERVER["QIBM_USE_DESCRIPTOR_STDIO"] Y 
_SERVER["HTTP_USER_AGENT"] Mozilla/5.0 (Windows NT 6.1; rv:20.0) Gecko/20100101 Firefox/20.0 
_SERVER["HTTP_ACCEPT"] text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
_SERVER["HTTP_ACCEPT_LANGUAGE"] en-US,en;q=0.5 
_SERVER["HTTP_ACCEPT_ENCODING"] gzip, deflate 
_SERVER["HTTP_DNT"] 1 
_SERVER["HTTP_CONNECTION"] keep-alive 
_SERVER["HTTP_PRAGMA"] no-cache 
_SERVER["HTTP_CACHE_CONTROL"] no-cache 
_SERVER["PATH"] /bin:/usr/bin:/usr/ucb:/usr/bsd:/usr/local/bin 
_SERVER["SERVER_SIGNATURE"] no value 
_SERVER["SERVER_SOFTWARE"] Apache 
_SERVER["DOCUMENT_ROOT"] /www/zendsvr/htdocs 
_SERVER["SERVER_ADMIN"] [no address given] 
_SERVER["SCRIPT_FILENAME"] /www/zendsvr/htdocs/hello.php 
_SERVER["DOCUMENT_NAME"] /www/zendsvr/htdocs/hello.php 
_SERVER["REMOTE_PORT"] 54747 
_SERVER["GATEWAY_INTERFACE"] CGI/1.1 
_SERVER["SERVER_PROTOCOL"] HTTP/1.1 
_SERVER["REQUEST_METHOD"] GET 
_SERVER["QUERY_STRING"] no value 
_SERVER["REQUEST_URI"] /hello.php 
_SERVER["SCRIPT_NAME"] /hello.php 
_SERVER["DOCUMENT_URI"] /hello.php 
_SERVER["RULE_FILE"] conf/httpd.conf 
_SERVER["PHP_SELF"] /hello.php 
_SERVER["REQUEST_TIME"] 1367514482 

編輯4:如何使服務器作業CCSID(37)

有幾種方法來獲取服務器作業運行美國英語。這是一個管理決定,哪個對整體服務器操作影響最小。我通過IPL將我的美國英語系統設置爲QCCSID 37,並且沒有發現任何問題。

  1. CHGSYSVAL QCCSID 37 - 這會將整個服務器設置爲美國英語。重新啓動Apache服務器以生效。
  2. CHGUSRPRF QTMHHTTP CCSID(37) - 這會將所有HTTP服務器作業設置爲美國英語。重新啓動Apache服務器以生效。
  3. 重新配置Apache服務器。設置CgiConvMode EBCDICDefaultNetCCSID 819CGIJobCCSID 37重新啓動Apache服務器以使其生效。有關詳細信息,請參見CGI Data Conversions。這會將一個Apache服務器的工作設置爲美國英語。
  4. CHGPF ... CCSID(37) - 這將設置文件爲美國英語。需要改變他們。

這並非是所有的包容性。更像是層次結構如何融合在一起的簡要說明。

+0

呃......我想一步一步接近。 (參見OP的編輯)我們將用戶配置文件改爲37而不是* SYSVAL,現在我們取回字符串(7)「?與實際人物更接近......任何想法? - - 先謝謝你! – adam 2013-05-02 14:56:30

+0

你期望看到什麼值? SELECT語句只有2列,但變量是'string(7)'和'string(8)'。你能顯示正在返回的十六進制值嗎? – 2013-05-02 15:04:04

+0

我期望看到來自OP的「Regular」和「Markdown」。 *或者至少是普通的英文字母:)* ...在示例中我確實有不同的標題,而不是我的實時代碼,對不起。我做了編輯以顯示正在使用的正確標題。答案是短的一個字符是奇怪的。正在重複的兩個十六進制值是「d98587a4938199」和「d48199928496a695」。刪除重複以避免混淆。 – adam 2013-05-02 15:42:11

1

我發現了一個更好的方式來做到這一點...在你的DSN使用TRANSLATE or ForceTranslation keyword。例如:

odbc:DRIVER={iSeries Access ODBC Driver};SYSTEM=as400.myserver.local;TRANSLATE=1; 

您不必在查詢中更改任何文件,系統設置或使用CAST。