Получите результаты запросов MySQL как их собственный тип данных?

Я попытался получить результаты запросов MySQL, используя mysql_fetch_row() и mysql_result() и числовые значения возвращаются как строки.

Есть ли способ получить данные в виде их типа данных, хранящихся в таблице?

Приложение будет запрашивать множество разных запросов, поэтому я не смогу использовать значения в качестве предполагаемого типа данных на основе 1 на 1.

Я не думаю, что получение данных в их родных типах данных (то есть что-либо еще, что строки) можно сделать в PHP 5.2 …

В PHP 5.3 становится возможным, если я правильно помню, когда вы используете новый (новый как в PHP> = 5.3) драйвер mysqlnd (MySQL Native Driver) .

После того, как я снова просмотрел свои закладки, я нашел эту статью о mysqlnd: PDO_MYSQLND: The new features of PDO_MYSQL in PHP 5.3

В нем говорится (цитата):

Преимущества использования mysqlnd для PDO

mysqlnd возвращает собственные типы данных при использовании Подготовленных утверждений на стороне сервера, например, столбец INT возвращается как целочисленная переменная, а не как строка. Это означает меньшее количество преобразований данных внутри.

Но это только PHP 5.3 (при условии, что ваша версия PHP 5.3 скомпилирована с помощью mysqlnd ( а не старого libmysql) ) и, похоже, имеет место только для подготовленных операторов 🙁

Что не совсем помогает, в вашей ситуации, я думаю …

И вот еще один, по-прежнему о новых функциях mysqlnd, который говорит об этом для не только подготовленных операторов: PHP: новый сетевой трафик, экономия памяти и памяти с помощью mysqlnd .

Не уверен, что это было объединено с официальным драйвером mysqlnd, но лучший способ – попробовать; но он все равно будет PHP> = 5.3, во всяком случае …

Другим решением было бы иметь на стороне PHP некоторую систему сопоставления (например, ORM) для преобразования результатов, полученных из баз данных DB в PHP …

И да, это плохо, если вы хотите использовать такие операторы, как === и !== , которые чувствительны к типу …

Я реализовал это вручную. На самом деле это не так уж плохо, всего несколько строк.

Как и было предложено, вызовите mysqli_fetch_fields () ресурса, полученного в результате запроса.

Затем из сопоставления чисел типа поля PHP в типы данных MySQL (см. Трудолюбивую работу здесь http://www.php.net/manual/en/mysqli-result.fetch-field-direct.php ) вы можете преобразовать ваши значения из широкого диапазона типов баз данных, возвращаемых как строки MySQLi, в соответствующий тип в PHP.

Насколько это замедление я не уверен.

попробуйте это, если использовать mysqli вместо PDO

 $mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1); 

Я написал функцию, чтобы обойти это (для PDO):

 /** * Converts columns from strings to types according to * PDOStatement::columnMeta * * @param PDOStatement $st * @param array $assoc returned by PDOStatement::fetch with PDO::FETCH_ASSOC * @return copy of $assoc with matching type fields */ function convertTypes(PDOStatement $statement, $assoc) { for ($i = 0; $columnMeta = $statement->getColumnMeta($i); $i++) { $type = $columnMeta['native_type']; switch($type) { case 'DECIMAL': case 'TINY': case 'SHORT': case 'LONG': case 'LONGLONG': case 'INT24': $assoc[$columnMeta['name']] = (int) $assoc[$columnMeta['name']]; break; case 'DATETIME': case 'DATE': case 'TIMESTAMP': $assoc[$columnMeta['name']] = strtotime($assoc[$columnMeta['name']]); break; // default: keep as string } } return $assoc; } 

Конечно, список типов не является полным, и преобразование упрощено, но может быть полезно для начала.

В дополнение к ответу Паскаля МАРТИНА, если вы используете MySQLi, также следует работать. Попробуй это:

 <?php $mysqli = new mysqli("example.com", "user", "password", "database"); if ($mysqli->connect_errno) { echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; } if (!$mysqli->query("DROP TABLE IF EXISTS test") || !$mysqli->query("CREATE TABLE test(id INT, label CHAR(1))") || !$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')")) { echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error; } $stmt = $mysqli->prepare("SELECT id, label FROM test WHERE id = 1"); $stmt->execute(); $res = $stmt->get_result(); $row = $res->fetch_assoc(); printf("id = %s (%s)\n", $row['id'], gettype($row['id'])); printf("label = %s (%s)\n", $row['label'], gettype($row['label'])); ?> 

Вышеприведенный пример выводит:

 id = 1 (integer) label = a (string) 

Вы можете получить дополнительную информацию здесь: https://dev.mysql.com/doc/apis-php/en/apis-php-mysqli.quickstart.prepared-statements.html

Надеюсь это поможет