Это ошибка MySQLi?Возвращенные поля усекаются до 8193 байтов при определенных обстоятельствах - PullRequest
2 голосов
/ 25 августа 2011

Когда я ВЫБИРАЮ столбец Geometry с AsText(), возвращаемое значение усекается до 8193 байтов.

Мне это кажется ошибкой, но я хотел бы сначала опубликовать здесь, чтобы узнать, не упускаю ли я что-то из-за того, как подготовленные операторы работают в MySQLi. Есть ли какие-либо настройки, которые я здесь пропускаю?

Скорее всего, я либо делаю это неправильно, либо есть настройка, о которой я не знаю.

Все приведенные ниже тестовые примеры, кроме первого, усекают поле geom до 8193 байтов. Я дергаю себя за волосы, пытаясь определить причину этого.

Версия PHP: PHP 5.3.3-7 with Suhosin-Patch (cli) (built: Jan 5 2011 12:52:48) Версия MySQL: 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";
?>

Ожидаемый результат:

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

Вот мой фактический результат при выполнении выше:

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

Ответы [ 2 ]

2 голосов
/ 28 января 2012

Это, вероятно, потому что $ stmt не получает un / reset как другие значения. Он всегда возвращает непротиворечивые данные при первом вызове;)

0 голосов
/ 16 февраля 2012

Эта проблема исчезла, когда PHP был обновлён до 5.3.8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...