Как определить тип столбца с помощью PDO? - PullRequest
4 голосов
/ 01 июля 2010

Мне нужен способ определения типа столбца базы данных (varchar / numeric / date / ...) при чтении из БД с помощью PDO.

При извлечении значений из БД PDO создает толькостроковые значения, независимо от фактического типа столбца таблицы.

Есть ли какой-нибудь не зависящий от драйвера способ получения этой информации?Я знаю, что существуют операторы SQL, которые извлекают типы для любой таблицы, но я бы предпочел более общее решение.

РЕДАКТИРОВАТЬ: PDOStatement :: getColumnMeta () имеетбесполезен для меня, потому что он не поддерживается драйвером PDO, который я использую в данный момент (Oracle).

Ответы [ 6 ]

6 голосов
/ 01 июля 2010

Взгляните на этот метод: PDOStatement-> getColumnMeta

3 голосов
/ 01 июля 2010

Вот как я это сделал в своем классе 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

2 голосов
/ 01 июля 2010

Я недавно написал функцию, которая извлекала информацию о столбцах таблицы.В итоге я сделал что-то вроде этого:

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 .

2 голосов
/ 01 июля 2010

Он помечен как "экспериментальный", но метод PDOStatement->getColumnMeta выглядит так, как будто он будет делать то, что вы хотите.

0 голосов
/ 29 июня 2011

Если вы работаете с 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'
0 голосов
/ 01 июля 2010

Если вы работаете с 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...