mysql_fetch_row()
と を使用して MySQL クエリ結果を取得しようとしましたmysql_result()
が、数値が文字列として返されます。
テーブルに格納されているデータ型としてデータを取得する方法はありますか?
アプリケーションはさまざまなクエリを実行するため、値を意図したデータ型として 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
それはこう言っています(引用):
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のような演算子を使用したい場合、これは悪いことです...!==
これを手動で実装しました。実際にはそれほど悪くはありません。ほんの数行です。
提案されているように、クエリの結果のリソースで mysqli_fetch_fields() を呼び出します。
次に、PHP フィールド タイプ番号の MySQL データ タイプへのマッピングから (ここの勤勉な作業を参照してください http://www.php.net/manual/en/mysqli-result.fetch-field-direct.php )、値を変換できます。 MySQLi によって文字列として返されるさまざまなデータベース タイプから、PHP の適切なタイプに変換します。
それがどの程度の減速なのか、私にはわかりません。
これを回避する関数を作成しました(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;
}
もちろん、型リストは完全ではなく、変換は単純化されすぎていますが、最初は役に立ちます。