获取MySQL查询结果作为其本机数据类型?

时间:2010-03-12 05:15:47

标签: php mysql resultset types

我尝试使用mysql_fetch_row()mysql_result()获取MySQL查询结果,并将数值作为字符串返回。

有没有办法获取数据作为存储在表中的数据类型?

应用程序将查询许多不同的查询,因此我将无法以1为单位将值转换为预期的数据类型。

5 个答案:

答案 0 :(得分:15)

我不认为以其本机数据类型(即其他任何字符串)获取数据可以在PHP 5.2中完成...

在PHP 5.3中,如果我没记错的话,当你使用新的(在PHP> = 5.3中新的) mysqlnd (MySQL本机驱动程序) driver。

在仔细阅读我的书签之后,我发现了一篇关于mysqlnd的文章:PDO_MYSQLND: The new features of PDO_MYSQL in PHP 5.3

它说(引用):

  

将mysqlnd用于PDO的优点

     

mysqlnd返回本机数据类型时   使用服务器端准备语句,   例如,返回INT列   作为整数变量而不是a   串。这意味着数据更少   内部转换。

但这只是PHP 5.3(假设您的PHP 5.3版本是使用mysqlnd(而不是旧的libmysql)编译的),并且似乎只是预编译语句的情况: - (< / p>

在你的情况下,这对你的情况不太有帮助,我猜......


这是另一个,仍然是关于mysqlnd的新功能,它不仅讨论了这个准备语句:PHP: New network traffic, CPU and memory savings with mysqlnd

不确定这已经合并到官方的mysqlnd驱动程序中,但最好的方法是尝试;但它仍然只是PHP&gt; = 5.3,无论如何......


另一个解决方案是在PHP端,使用某种映射系统(如ORM)将数据库中的结果转换为PHP数据类型......

是的,如果您想使用类型敏感的===!==等运算符,那就不好了。

答案 1 :(得分:6)

如果使用mysqli而不是PDO

,请尝试此操作
$mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);

答案 2 :(得分:3)

我已经实现了这种手动方式。它实际上并不太糟糕,只有几行。

根据建议,在查询产生的资源上调用mysqli_fetch_fields()。

然后从PHP字段类型编号到MySQL数据类型的映射(请参阅此处的勤劳工作http://www.php.net/manual/en/mysqli-result.fetch-field-direct.php),您可以将MySQL中返回为字符串的各种数据库类型的值转换为适当的类型用PHP。

它减速了多少我不确定。

答案 3 :(得分: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;
}

当然,类型列表不完整,转换过于简单,但对于开始非常有用。

答案 4 :(得分:-1)

除了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

希望这有帮助