Когда я ВЫБИРАЮ столбец 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