繁体   English   中英

如何使用PDO确定列类型?

[英]How can I determine the column type with PDO?

当从具有PDO的DB读取时,我需要一种方法来确定数据库列的类型(varchar / numeric / date / ...)。

从DB中获取值时,无论表列的实际类型如何,PDO都只生成字符串值。

是否有任何非驱动程序的特定方式来获取此信息? 我知道有SQL语句可以检索任何给定表的类型,但我更喜欢更通用的解决方案。

编辑: PDOStatement :: getColumnMeta()对我没用,因为我目前使用的PDO驱动程序(Oracle)不支持它。

看看这个方法: PDOStatement-> getColumnMeta

这就是我在WraPDO课程中的表现:

$tomet = $sth->getColumnMeta($column_index);
$tomet['type'] = $this->_translateNativeType($tomet['native_type']);

private function _translateNativeType($orig) {
    $trans = array(
        'VAR_STRING' => 'string',
        'STRING' => 'string',
        'BLOB' => 'blob',
        'LONGLONG' => 'int',
        'LONG' => 'int',
        'SHORT' => 'int',
        'DATETIME' => 'datetime',
        'DATE' => 'date',
        'DOUBLE' => 'real',
        'TIMESTAMP' => 'timestamp'
    );
    return $trans[$orig];
}

$ sth: PDOStatement-> getColumnMeta

它标记为“实验性”,但PDOStatement->getColumnMeta方法看起来会像你想要的那样。

我刚才写了一个函数,它提取了表列信息。 我最终做了这样的事情:

SHOW COLUMNS FROM <table> WHERE Field = ?

对于典型的主键,产生这个:

+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
+-------+---------+------+-----+---------+----------------+

然后我将输出解析为可用的数组。 但是,这是PHP 5.1.0之前的版本。 现在你可以使用PDOStatement-> getColumnMeta

如果您正在使用Oracle:

select COLUMN_NAME,
       DATA_TYPE,
       DATA_LENGTH,
       DATA_PRECISION,
       DATA_SCALE
from user_tab_cols
where table_name = '<Table Name>'
order by column_id

但它不便携

许多SQL风格也有

DESCRIBE <Table Name>

如果您正在使用Postgres:

select
    CHARACTER_MAXIMUM_LENGTH,
    COLUMN_NAME,
    IS_NULLABLE,
    COLUMN_DEFAULT,
    NUMERIC_PRECISION,
    NUMERIC_SCALE,
    UDT_NAME 
from
    INFORMATION_SCHEMA.COLUMNS 
where
    TABLE_NAME='table_name'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM