19

mysql_fetch_row()と を使用して MySQL クエリ結果を取得しようとしましたmysql_result()が、数値が文字列として返されます。

テーブルに格納されているデータ型としてデータを取得する方法はありますか?

アプリケーションはさまざまなクエリを実行するため、値を意図したデータ型として 1 つずつキャストすることはできません。

4

5 に答える 5

19

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

それはこう言っています(引用):

PDO に mysqlnd を使用する利点

mysqlnd は、サーバー側のプリペアド ステートメントを使用する場合、ネイティブ データ型を返します。たとえば、INT 列は、文字列ではなく整数変数として返されます。つまり、内部でのデータ変換が少なくなります。

しかし、これはPHP 5.3のみです(PHP 5.3のバージョンが(古いlibmysqlではなく) mysqlndでコンパイルされている場合)、準備されたステートメントの場合のみのようです:-(

あなたの状況では、これはあまり役に立ちません...


そして、これは別の mysqlnd の新機能です。これは、準備されたステートメントだけでなく、これについても語っています。PHP: mysqlnd による新しいネットワーク トラフィック、CPU およびメモリの節約

ただし、これが公式の mysqlnd ドライバーにマージされているかどうかはわかりませんが、試してみるのが最善の方法です。とにかく、それはまだPHP > = 5.3のみです...


もう1つの解決策は、PHP側で、DBからの結果をPHPデータ型に変換するため のある種のマッピングシステム(ORMなど)を持つことです...

はい、型に依存する===andのような演算子を使用したい場合、これは悪いことです...!==

于 2010-03-12T05:20:06.580 に答える
3

これを手動で実装しました。実際にはそれほど悪くはありません。ほんの数行です。

提案されているように、クエリの結果のリソースで mysqli_fetch_fields() を呼び出します。

次に、PHP フィールド タイプ番号の MySQL データ タイプへのマッピングから (ここの勤勉な作業を参照してください http://www.php.net/manual/en/mysqli-result.fetch-field-direct.php )、値を変換できます。 MySQLi によって文字列として返されるさまざまなデータベース タイプから、PHP の適切なタイプに変換します。

それがどの程度の減速なのか、私にはわかりません。

于 2011-08-08T10:54:03.143 に答える
0

これを回避する関数を作成しました(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;
}

もちろん、型リストは完全ではなく、変換は単純化されすぎていますが、最初は役に立ちます。

于 2012-03-31T03:13:30.173 に答える