Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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...

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

Ответ 2

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

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

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

Сколько замедления я не уверен.

Ответ 3

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

$mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);

Ответ 4

Я написал функцию, чтобы обойти это (для 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;
}

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

Ответ 5

В дополнение к ответу Pascal MARTIN, если вы используете 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

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