php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #40957 PDO & UTF8 string length & truncate issues
Submitted: 2007-03-30 09:19 UTC Modified: 2016-03-08 01:50 UTC
From: gerald at copix dot org Assigned:
Status: Not a bug Package: PDO OCI
PHP Version: 5.2.1 OS: Linux
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: gerald at copix dot org
New email:
PHP Version: OS:

 

 [2007-03-30 09:19 UTC] gerald at copix dot org
Description:
------------
Hello, 

While configured in UTF8 mode (eg with the connection string allRequiredInfos;charset=UTF8), when we try to get a VARCHAR2 field limited to X chars, PDO is assuming accents (???...) are 2 letters length) and then generates a warning if our content is X chars length (with accents) and truncates the end of the field.

Warning:  PDOStatement::fetchAll() [scriptAdr/function.PDOStatement-fetchAll]: column 0 data was too large for buffer and was truncated to fit it in /scriptPath.class.php on line 73

We tryed to activate mbstring extension, to use func_overload=4 with no success (the database itself is in ISO-8859-1).

If we try not to communicate with the database in UTF8, accents are just ignored (? becomes e, ...) even with correct session parameters.

Reproduce code:
---------------
Considering the table 
MYTABLE {
   MYFIELD VARCHAR2(2);
}

with one record : 
MyField 
--------
?a

$pdo = new PDO ('pdo_oci:dbname=

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = myhost)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SID = mysid)

    )

  );charset=UTF8', 'myLogin', 'myPassword');

$stmt = $pdo->doQuery ('select MYFIELD from MYTABLE');
$stmt->fetchAll (); //warning

Expected result:
----------------
(array[0]->MYFIELD === '?a') === true;

Actual result:
--------------
(array[0]->MYFIELD === '?') === true
(array[0]->MYFIELD === '?a') === true


Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2007-03-30 09:27 UTC] gerald at copix dot org
I made a mistake writing the actual result, it is obviously : 

(array[0]->MYFIELD === '?') === true
(array[0]->MYFIELD === '?a') === false

Sorry for the typo.
 [2007-04-03 19:01 UTC] tony2001@php.net
UTF8 requires 2 bytes per character.
Your database can store only 2 bytes (because it's ISO8859), but you're trying to put 4 and receive the expected error.
Not PHP problem.
 [2011-11-04 15:49 UTC] tomasz at trejderowski dot pl
Comment given by tony2001@php.net seems to be wrong, because:

1. Database store ONE bytes (because it's ISO8859 - ISO is single-byte), but user is trying to put TWO bytes - UTF-8 is two-byte!

2. The very same results occurs, when RETRIEVING data (SELECT).

3. Certainly PHP problem -- the very same SQLs run directly on DB (Oracle in my example) runs without problems, but fails in PDO.
 [2016-03-08 01:50 UTC] sixd@php.net
-Package: PDO related +Package: PDO OCI
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sat Dec 21 13:01:31 2024 UTC