From: bmr at comtime dot com Operating system: Linux PHP version: 4.3.10 PHP Bug Type: OCI8 related Bug description: NVARCHAR2 columns are truncated
Description: ------------ NVARCHAR2 columns can be used to store UTF-8 or UTF-16 characters. When using UTF-8 it can take 3 (or more??) bytes to represent one character. PHP truncates strings that have byte representations longer than 2 times the character length. This is actually an Oracle bug because the OCI call returns the wrong byte length. Here's my patch: --- php-4.3.10/ext/oci8/oci8.c Wed Nov 3 08:35:56 2004 +++ php-4.3.10.cti/ext/oci8/oci8.c Mon Feb 28 15:37:54 2005 @@ -1443,6 +1443,7 @@ ub4 iters; ub4 colcount; ub2 dynamic; + ub1 charset_form; int dtype; dvoid *buf; oci_descriptor *descr; @@ -1573,6 +1574,21 @@ return 0; /* XXX we loose memory!!! */ } + if(outcol->data_type == SQLT_CHR) { + CALL_OCI_RETURN(error, OCIAttrGet( + (dvoid *)param, + OCI_DTYPE_PARAM, + (dvoid *)&charset_form, + (dvoid *)0, + OCI_ATTR_CHARSET_FORM, + statement->pError)); + statement->error = oci_error(statement->pError, "OCIAttrGet OCI_DTYPE_PARAM/OCI_ATTR_CHARS ET_FORM", error); + if (statement->error) { + oci_handle_error(statement->conn, statement->error); + return 0; /* XXX we loose memory!!! */ + } + } + CALL_OCI_RETURN(error, OCIAttrGet( (dvoid *)param, OCI_DTYPE_PARAM, @@ -1700,6 +1716,9 @@ ) { outcol->storage_size4 = 512; /* XXX this should fit "most" NLS date-formats and Numbers */ } else { + if(charset_form == SQLCS_NCHAR) + outcol->storage_size4 *=2; /* double for unicode */ + outcol->storage_size4++; /* add one for string terminator */ } if (outcol->data_type == SQLT_BIN) { Reproduce code: --------------- ocifetchinto() -- Edit bug report at http://bugs.php.net/?id=32140&edit=1 -- Try a CVS snapshot (php4): http://bugs.php.net/fix.php?id=32140&r=trysnapshot4 Try a CVS snapshot (php5.0): http://bugs.php.net/fix.php?id=32140&r=trysnapshot50 Try a CVS snapshot (php5.1): http://bugs.php.net/fix.php?id=32140&r=trysnapshot51 Fixed in CVS: http://bugs.php.net/fix.php?id=32140&r=fixedcvs Fixed in release: http://bugs.php.net/fix.php?id=32140&r=alreadyfixed Need backtrace: http://bugs.php.net/fix.php?id=32140&r=needtrace Need Reproduce Script: http://bugs.php.net/fix.php?id=32140&r=needscript Try newer version: http://bugs.php.net/fix.php?id=32140&r=oldversion Not developer issue: http://bugs.php.net/fix.php?id=32140&r=support Expected behavior: http://bugs.php.net/fix.php?id=32140&r=notwrong Not enough info: http://bugs.php.net/fix.php?id=32140&r=notenoughinfo Submitted twice: http://bugs.php.net/fix.php?id=32140&r=submittedtwice register_globals: http://bugs.php.net/fix.php?id=32140&r=globals PHP 3 support discontinued: http://bugs.php.net/fix.php?id=32140&r=php3 Daylight Savings: http://bugs.php.net/fix.php?id=32140&r=dst IIS Stability: http://bugs.php.net/fix.php?id=32140&r=isapi Install GNU Sed: http://bugs.php.net/fix.php?id=32140&r=gnused Floating point limitations: http://bugs.php.net/fix.php?id=32140&r=float No Zend Extensions: http://bugs.php.net/fix.php?id=32140&r=nozend MySQL Configuration Error: http://bugs.php.net/fix.php?id=32140&r=mysqlcfg