【问题标题】:Get MySQL Query Results as Their Native Data Type?获取 MySQL 查询结果作为其原生数据类型?
【发布时间】:2011-01-26 16:51:12
【问题描述】:

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

有什么方法可以将数据作为其数据类型存储在表中吗?

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

【问题讨论】:

    标签: php mysql resultset types


    【解决方案1】:

    我不认为在 PHP 5.2 中可以使用它们的原生数据类型获取数据(即任何其他字符串)...

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

    在浏览了我的书签之后,我发现了这篇关于 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: New network traffic, CPU and memory savings with mysqlnd

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


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

    是的,如果你想使用像 ===!== 这样类型敏感的运算符,这很糟糕......

    【讨论】:

    • 感谢帕斯卡·马丁!我已经在谷歌上搜索了几个小时,但没有找到任何我可以使用的东西。我对 PHP 比较陌生,但听起来如果我想要原生支持,我需要使用 PDO。不幸的是,我的主机正在运行 5.2.something... 同样困难的是,我正在尝试创建一个包含不同查询信息的 xml 报告文件输入。 PHP 脚本读取请求的 xml 文件并将查询发送到数据库,因此我真的不知道正在查询什么数据以及应该如何返回它。我猜是时候发挥创意了:)
    • PDO 与否 PDO 不应该改变任何东西,在这种情况下:重要的是下面使用的驱动程序 (即 libmysql vs mysqlnd) - 我什至不确定PHP 5.3.2 中的 mysqlnd 确实返回标准查询的本机类型;;;在您的情况下,无论如何,使用 PHP 5.2,您将拥有的唯一解决方案是一些映射层,它会在需要时进行类型转换...
    • 请注意,如果使用 PDO,您需要turn off prepared statement emulation
    【解决方案2】:

    如果使用 mysqli 而不是 PDO 试试这个

    $mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);
    

    【讨论】:

      【解决方案3】:

      我已经以手动方式实现了这一点。其实也不算太差,就几行而已。

      按照建议,对查询产生的资源调用 mysqli_fetch_fields()。

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

      我不知道减速到什么程度。

      【讨论】:

        【解决方案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");
          
          $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')");
          
          $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

          【讨论】:

            猜你喜欢
            • 2015-10-24
            • 1970-01-01
            • 2017-04-25
            • 2021-03-23
            • 2015-05-05
            • 2010-09-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多