ID: 27156 Comment by: max at pict dot lviv dot ua Reported By: sanjok at pict dot lviv dot ua Status: No Feedback Bug Type: OCI8 related Operating System: Linux SuSE 7.3&8.1 PHP Version: 4.3.4 Assigned To: tony2001 New Comment:
One more investigation: If I simply convert column from char to varchar2 using ALTER TABLE statement, it doesn't help. OCIFetchInto behaves correctly only if table was created with varchar2 type. But even with varchar2 column, if I fill entire column with umlauts, OCIFetchInto and OCIFetch fail. Sample: SQL> desc test; Name Null? Typ ----------------------------------------- -------- ---------------------------- NAME VARCHAR2(10) SQL> select name, length(name) from test order by name; NAME LENGTH(NAME) ------------------------------ ------------ ü 1 üü 2 üüüüü 5 üüüüüü 6 üüüüüüüüüü 10 --So you see that Oracle shows length correctly. Now I use the following php script: ociinternaldebug(true); $connection = OCILogon("????", "????", "????"); $query = "SELECT * FROM TEST order by name"; $statement = OCIParse ($connection, $query); OCIExecute($statement); while (OCIFetchInto ($statement, $row, OCI_ASSOC+OCI_RETURN_NULLS)) { var_dump($row); } OCIExecute($statement); while(OCIFetch($statement)) { var_dump (OCIResult($statement, "NAME")); } And here's result of ociinternaldebug: OCIDebug: _oci_open_server new conn=0 dname=????<br /> OCIDebug: _oci_open_session new sess=5 user=????<br /> OCIDebug: oci_do_connect: id=6<br /> OCIDebug: oci_parse "SELECT * FROM TEST order by name" id=7 conn=6<br /> array(1) { ["NAME"]=> string(2) "ü" } array(1) { ["NAME"]=> string(4) "üü" } array(1) { ["NAME"]=> string(10) "üüüüü" } OCIDebug: _oci_make_zval: NAME,retlen = 10,retlen4 = 0,storage_size4 = 11,indicator 6, retcode = 1406<br /> array(1) { ["NAME"]=> bool(false) } OCIDebug: _oci_make_zval: NAME,retlen = 10,retlen4 = 0,storage_size4 = 11,indicator 10, retcode = 1406<br /> array(1) { ["NAME"]=> bool(false) } string(2) "ü" string(4) "üü" string(10) "üüüüü" OCIDebug: _oci_make_zval: NAME,retlen = 10,retlen4 = 0,storage_size4 = 11,indicator 6, retcode = 1406<br /> bool(false) OCIDebug: _oci_make_zval: NAME,retlen = 10,retlen4 = 0,storage_size4 = 11,indicator 10, retcode = 1406<br /> bool(false) OCIDebug: START php_rshutdown_oci<br /> OCIDebug: END php_rshutdown_oci<br /> OCIDebug: START _oci_stmt_list_dtor: id=7 last_query="SELECT * FROM TEST order by name"<br /> OCIDebug: START _oci_column_hash_dtor: NAME<br /> OCIDebug: END _oci_column_hash_dtor: NAME<br /> OCIDebug: START _oci_conn_list_dtor: id=6<br /> OCIDebug: nothing to do..<br /> OCIDebug: END _oci_conn_list_dtor: id=6<br /> OCIDebug: END _oci_stmt_list_dtor: id=7<br /> OCIDebug: START _oci_close_session: logging-off sess=5<br /> OCIDebug: START _oci_close_server: detaching conn=4 dbname=????<br /> OCIDebug: START php_mshutdown_oci<br /> OCIDebug: END php_mshutdown_oci<br /> ------------- Some thoughts on this error: Combination of OCIFetch+OCIResult has the same problem. The error occurs when length of column value in bytes exceeds length of column defined in oracle + 1 byte. Length of column value differs from length of field for multi-byte encodings like UTF8, so probably there's an error with memory allocation (it's just a guess). And P.S.: By the way, when I change environment variable NLS_LANG to GERMAN_AUSTRIA.WE8DEC, everything's selected fine! Previous Comments: ------------------------------------------------------------------------ [2005-08-11 12:40:21] max at pict dot lviv dot ua We have this problem on multiple configurations, everywhere situation is the same. Case1: DB Server Compaq Tru64Unix + Oracle 10.1.0.3.0 Client machines: A. SuSE 7.3 + Oracle Client 9.0.1 B. SLES 9 + Oracle Instant Client 10 Case2: DB Server SuSE 8.1 + Oracle 9.0.1 Oracle Client 9.0.1 running on the same machine. We have tried PHP 4.3.10 and 4.3.11, and this doesn't change the situation, problem persists. In SQLPlus I see data correctly saved from a web application, but when using OCIFetchInto in PHP script I receive FALSE instead of column value when column contains more than one umlaut character. Some details: NLS_LANG = GERMAN_AUSTRIA.UTF8; Database encoding is WE8DEC. ------------------------------------------------------------------------ [2005-04-02 01:00:04] php-bugs at lists dot php dot net No feedback was provided for this bug for over a week, so it is being suspended automatically. If you are able to provide the information that was originally requested, please do so and change the status of the bug back to "Open". ------------------------------------------------------------------------ [2005-03-25 01:42:42] [EMAIL PROTECTED] Please try using this CVS snapshot: http://snaps.php.net/php4-STABLE-latest.tar.gz For Windows: http://snaps.php.net/win32/php4-win32-STABLE-latest.zip ------------------------------------------------------------------------ [2004-02-11 04:13:23] sanjok at pict dot lviv dot ua P.S.: Feedback was sent on Thu, 5 Feb 2004 15:25:01 (+0200) to mr. Anatoly Dovgal, but there was no response from him. ------------------------------------------------------------------------ [2004-02-11 04:06:06] sanjok at pict dot lviv dot ua <?php /* Oracle 9.0.1i database internal encoding WE8DEC database client encoding specified by NLS_LANG parameter is GERMAN_AUSTRIA.UTF8, so Oracle automatically converts characters to client encoding. CREATE TABLE TEST ( NAME CHAR(10) ); insert into test values ('ü'); insert into test values ('üü'); NOTE: this error doesn't occur when we use column type VARCHAR2 insted of CHAR */ ociinternaldebug(true); $connection = OCILogon(DB_USER, DB_PASS, DB_NAME); $query = "SELECT * FROM TEST"; $statement = OCIParse ($connection, $query); OCIExecute($statement); while (OCIFetchInto ($statement, $row, OCI_ASSOC+OCI_RETURN_NULLS)) { var_dump($row); } ?> result of ociinternaldebug. OCIDebug: oci_do_connect: id=3 OCIDebug: oci_parse "SELECT * FROM TEST" id=4 conn=3 array(1) { ["NAME"]=> string(11) "u " } OCIDebug: _oci_make_zval: NAME,retlen = 11,retlen4 = 0,storage_size4 = 11,indicator 10, retcode = 1406 array(1) { ["NAME"]=> bool(false) } OCIDebug: START php_rshutdown_oci OCIDebug: END php_rshutdown_oci OCIDebug: START _oci_stmt_list_dtor: id=4 last_query="SELECT * FROM TEST" OCIDebug: START _oci_column_hash_dtor: NAME OCIDebug: END _oci_column_hash_dtor: NAME OCIDebug: START _oci_conn_list_dtor: id=3 OCIDebug: nothing to do.. OCIDebug: END _oci_conn_list_dtor: id=3 OCIDebug: END _oci_stmt_list_dtor: id=4 ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/27156 -- Edit this bug report at http://bugs.php.net/?id=27156&edit=1