mysql_query сохранить тип данных, созданный в таблице, при возврате?

У меня есть таблица в mysql:

CREATE TABLE user (id INT, name VARCHAR(250));

Я запрашиваю таблицу:

$result = mysql_query("SELECT id,name FROM user");

Собираю результаты:

while($row = mysql_fetch_assoc($result) $rv[] = $row;

И я возвращаю данные:

echo json_encode($rv);

Проблема в том, что идентификатор возвращается в виде строки, а не целого числа, даже до json_encode. Если я заставлю $row['id'] = (int)$row['id']; - работает нормально.

Как я могу заставить mysql вернуть правильный тип данных в строке $?

10x.


person aviv    schedule 23.02.2010    source источник


Ответы (2)


PDO->bindColumn может ли это

$stmt = $dbh->prepare($sql);

$stmt->bindColumn('int_col', $intVar, PDO::PARAM_INT);
$stmt->bindColumn('string_col', $strVar, PDO::PARAM_STR);

$stmt->execute();

$stmt->fetch(PDO::FETCH_BOUND);

$intVar будет автоматически преобразован в int

person user187291    schedule 23.02.2010
comment
Во-первых, спасибо, но зачем мне указывать тип данных, когда это поле объявлено в таблице SQL как INT... - person aviv; 23.02.2010
comment
ну, потому что интерфейс db не поддерживает это. Все, что вы получаете от db, — это массив строк. Вы можете преобразовать некоторые из этих строк во что-то другое на уровне приложения, но это не произойдет автоматически без полноценного уровня ORM. - person user187291; 23.02.2010

К сожалению, в PHP ‹= 5.2 функции/классы MySQL (т. е. mysql_*, mysqli_* и PDO) основаны на libmysql — библиотеке C, которая обеспечивает поддержку связи с сервером MySQL.

Функции, использующие эту библиотеку, всегда возвращают строки, даже для целочисленных столбцов и столбцов с плавающей запятой, и вы ничего не можете с этим поделать: единственное решение состоит в том, чтобы иметь некоторый "отображающий слой" (например, ORM), который «знает» на стороне PHP, какого типа должен быть каждый столбец, и будет выполнять преобразование каждый раз, когда некоторые данные извлекаются из базы данных.

Примечание: то, как вы вставляете данные, ничего не меняет в том, что вы будете получать строки при извлечении данных из БД.


В PHP >= 5.3 функции, взаимодействующие с сервером MySQL, могут использовать mysqlnd (собственный драйвер MySQL) вместо libmysql, однако это необходимо настроить во время компиляции.

И возможность взаимодействовать с "родными" типами данных при определенных обстоятельствах является одной из приятных вещей, которые предоставляет mysqlnd; об этом должна быть пара интересных сведений в этой статье: PHP: новый сетевой трафик, Экономия ЦП и памяти с помощью mysqlnd.


Для краткости:

  • В PHP 5.2 вы будете получать только строки из базы данных; и вам придется сделать некоторое преобразование типов самостоятельно
  • В PHP 5.3 вы можете получить нативные типы данных — по крайней мере, в некоторых случаях.
person Pascal MARTIN    schedule 23.02.2010
comment
Очень познавательно. Благодарю вас ! - person aviv; 29.05.2011