ID: 25972 Updated by: [EMAIL PROTECTED] Reported By: phpbug at chipple dot net -Status: Open +Status: Verified Bug Type: ODBC related Operating System: Win2K 5.00.2195 SP4 PHP Version: 4.3.4RC2 New Comment:
Is this really a bug? The debate rages like so: One the one hand ODBC does not support multi-byte characters at all. On the other, the idea of multi- byte characters didn't exist (or if it did, not very prevailent) at the time of the original authoring of the ODBC system. Next question is, is there an easy fix. Nope. I've had a fix in the works, I've just lost all time to work upon it. Marking as verified, but not really sure it's a bug. Maybe a feature request really... Following the ODBCv2 specs, NVARCHAR is a type that doesn't exist, nor does TEXT, NTEXT, and many of the other wonderful types found today. Previous Comments: ------------------------------------------------------------------------ [2003-10-24 00:10:01] phpbug at chipple dot net Sorry here's the MSSQL extension code that should have been in the 2nd part of "Reproduce code". // MSSQL EXTENSION, data retrieved correctly $oConn = mssql_connect("localhost",C_Gen_sDbUser,C_Gen_sDbPassword); mssql_select_db("icds",$oConn); $oRs = mssql_query("SELECT * FROM T_Course WHERE aCourseID=1"); $aRow = mssql_fetch_array($oRs); // GOOD: Complete title retrieved (60 chars=120 bytes) echo $aRow["tTitle"]; mssql_close($oConn); ------------------------------------------------------------------------ [2003-10-23 23:26:31] phpbug at chipple dot net Description: ------------ This bug has been observed with PHP 4.3.3 and 4.3.4RC2. Database: MSSQL 2000 (8.00.760) SP3 I have a MSSQL database with a table containing a column tTitle of type nvarchar(80) (which stands for 80 multi-byte characters). When a string of 60 Japanese double-byte characters (120 bytes) stored in column tTitle is retrieved using PHP's ODBC extension, the value is truncated to 80 bytes. The PHP MSSQL extension retrieves the data correctly. Microsoft's ODBC driver (used from ASP) retrieves the data correctly. MSSQL table structure: CREATE TABLE [dbo].[T_Course] ( [aCourseID] [int] IDENTITY (1, 1) NOT NULL , [tTitle] [nvarchar] (80) COLLATE Japanese_CI_AS NOT NULL ) ON [PRIMARY] GO Test data (CSV): aCourseID,tTitle 1,[string of 60 Japanese double-byte characters] SQL query: SELECT * FROM T_Course WHERE aCourseID=1 Reproduce code: --------------- // ODBC EXTENSION, data truncated $oConn = odbc_connect(C_Gen_sDbDSN,C_Gen_sDbUser,C_Gen_sDbPassword); $oRs = odbc_exec($oConn,"SELECT * FROM T_Course WHERE aCourseID=1"); $aRow = odbc_fetch_array($oRs); // BAD: Title truncated to 80 _bytes_ echo $aRow["tTitle"]; odbc_close($oConn); // MSSQL EXTENSION, data retrieved correctly $oConn = odbc_connect(C_Gen_sDbDSN,C_Gen_sDbUser,C_Gen_sDbPassword); $oRs = odbc_exec($oConn,"SELECT * FROM T_Course WHERE aCourseID=1"); $aRow = odbc_fetch_array($oRs); // GOOD: Complete title retrieved (60 chars=120 bytes) echo $aRow["tTitle"]; odbc_close($oConn); Expected result: ---------------- The ODBC extension should truncate the retrieved data to 80 characters (instead of 80 bytes). Actual result: -------------- The ODBC extension truncates the retrieved data to 80 bytes. ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=25972&edit=1