开发者

Is this a MySQLi bug? Returned fields are truncated to 8193 bytes under certain circumstances

When I SELECT a Geometry column with AsText(), the returned value is truncated to 8193 bytes.

This looks like a bug to me, but I'd like to post here first to see if I'm missing anything with the way prepar开发者_StackOverflow社区ed statements work under MySQLi. Are there any settings I'm overlooking here?

Chances are I either I'm Doing It Wrong, or there is a setting I don't know about.

All test cases below except the first truncate the geom field to 8193 bytes. I'm pulling my hair out trying to determine the cause of this.

PHP Version: PHP 5.3.3-7 with Suhosin-Patch (cli) (built: Jan 5 2011 12:52:48) MySQL Version: mysql Ver 14.12 Distrib 5.0.32, for pc-linux-gnu (i486) using readline 5.2

<?php
$con = new mysqli(HOST, USER, PASS, DB);
$con->query("DROP TABLE IF EXISTS `mytable`");
$con->query("CREATE TABLE `mytable` (`text` TEXT , `geom` GEOMETRY)");

for ($i = 0; $i < 1300; ++$i) {
    $points[] = "$i $i";
}

$wkt = "LINESTRING(" . implode(',', $points) . ")";

$con->query("INSERT INTO `mytable` (`text`,`geom`) VALUES ('$wkt', GeomFromText('$wkt'))");

/* CASE #1 */
    echo "With store_result(), no string function on `text`:\n";
    $stmt = $con->prepare('SELECT `text`, ASTEXT(`geom`) FROM `mytable`');
    $stmt->execute();
    $stmt->store_result();
    $stmt->bind_result($text, $geom);
    $stmt->fetch();
    $stmt->close();
    echo "  Text is ".strlen($text)." bytes, Geom is ".strlen($geom)." bytes\n";
    unset($text);
    unset($geom);

/* CASE #2 */
    echo "With store_result(), left(`text`,10791):\n";
    $stmt = $con->prepare('SELECT LEFT(`text`,10791), ASTEXT(`geom`) FROM `mytable`');
    $stmt->execute();
    $stmt->store_result();
    $stmt->bind_result($text, $geom);
    $stmt->fetch();
    $stmt->close();
    echo "  Text is ".strlen($text)." bytes, Geom is ".strlen($geom)." bytes\n";
    unset($text);
    unset($geom);

/* CASE #3 */
    echo "With store_result(), only the `geom` column:\n";
    $stmt = $con->prepare('SELECT ASTEXT(`geom`) FROM `mytable`');
    $stmt->execute();
    $stmt->store_result();
    $stmt->bind_result($geom);
    $stmt->fetch();
    $stmt->close();
    echo "  Text is ".@strlen($text)." bytes, Geom is ".strlen($geom)." bytes\n";
    unset($text);
    unset($geom);

/* CASE #4 */
    echo "Without store_result(), no string function on `text`:\n";
    $stmt = $con->prepare( 'SELECT `text`, ASTEXT(`geom`) FROM `mytable`');
    $stmt->execute();

    $stmt->bind_result($text, $geom);
    $stmt->fetch();
    $stmt->close();
    echo "  Text is ".strlen($text)." bytes, Geom is ".strlen($geom)." bytes\n";
?>

Expected Result:

With store_result(), no string function on `text`:
  Text is 10791 bytes, Geom is 10791 bytes
With store_result(), left(`text`,10791):  
  Text is 10791 bytes, Geom is 10791 bytes
With store_result(), only the `geom` column:
  Text is 0 bytes, Geom is 10791 bytes
Without store_result(), no string function on `text`:
  Text is 10791 bytes, Geom is 10791 bytes

Here is my actual result when running the above:

With store_result(), no string function on `text`:
  Text is 10791 bytes, Geom is 10791 bytes
With store_result(), left(`text`,10791):  
  Text is 10791 bytes, Geom is 8193 bytes
With store_result(), only the `geom` column:
  Text is 0 bytes, Geom is 8193 bytes
Without store_result(), no string function on `text`:
  Text is 10791 bytes, Geom is 8193 bytes


It's probably because $stmt is not getting un/reset like the other values. It's always returns consistent data when you call it the first time ;)


This issue went away when PHP was upgraded to 5.3.8.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜