Як отримати тип даних стовпців таблиці mysql?


103

Я хочу отримати тип даних стовпця таблиці mysql.

Думав, що я можу використовувати MYSQLFIELDструктуру, але це перелічені типи полів.

Потім я спробував mysql_real_query()

Помилка, яку я отримую, це query was empty

Як отримати тип даних стовпця?

Відповіді:


116

Ви можете використовувати таблицю стовпців information_schema :

SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS 
  WHERE table_name = 'tbl_name' AND COLUMN_NAME = 'col_name';

9
Не забувайте: AND INDEX_SCHEMA = 'ім'я бази даних'
Inshallah

Я особисто спробував це і погодився б, щоб ця відповідь робила те, що планувала ОП. Зі сторони дивно, що дивно, як "table_name" є маленькими ковпачками навіть у посібнику, чи не повинно це бути ВНУТРІ? (Не те, що має значення)
чуцу

8
Також зверніть увагу, якщо тип даних має задану довжину, наприклад. VARCHAR (50) можна використовувати SELECT COLUMN_TYPEдля отримання додаткової інформації.
чуцу

11
якщо INDEX_SCHEMA не працює, спробуйте TABLE_SCHEMA = '
ім'я_бази_файлів

2
Цей запит НЕ має сенсу , якщо ви хочете знати тип для всіх стовпців (видалення AND COLUMN_NAME = 'col_name') , а то й відображати ім'я стовпця: SELECT COLUMN_NAME, DATA_TYPE FROM etc..
Skippy le Grand Gourou

78

Запит нижче повертає список інформації про кожне поле, включаючи тип поля MySQL. Ось приклад:

SHOW FIELDS FROM tablename
/* returns "Field", "Type", "Null", "Key", "Default", "Extras" */

Дивіться цю сторінку керівництва .


20
Альтернативою є EXPLAIN ім'я таблиці;
hobodave

Ця відповідь вимагає подальшої обробки, щоб отримати тип ... Відповідь, яку користувач83591 дав, набагато краще
чуцу

Додайте, WHERE FIELD = '<your column name>'якщо хочете інформацію про один стовпець.
Placid

37

Більшість відповідей - це дублікати, може бути корисним їх згрупувати. В основному запропоновано два простих варіанти.

Перший варіант

Перший варіант має 4 різних псевдоніми, деякі з яких досить короткі:

EXPLAIN db_name.table_name;
DESCRIBE db_name.table_name;
SHOW FIELDS FROM db_name.table_name;
SHOW COLUMNS FROM db_name.table_name;

(Примітка: в якості альтернативи db_name.table_name, можна використовувати другий FROM : db_name FROM table_name).

Це дає щось на зразок:

+------------------+--------------+------+-----+---------+-------+
| Field            | Type         | Null | Key | Default | Extra |
+------------------+--------------+------+-----+---------+-------+
| product_id       | int(11)      | NO   | PRI | NULL    |       |
| name             | varchar(255) | NO   | MUL | NULL    |       |
| description      | text         | NO   |     | NULL    |       |
| meta_title       | varchar(255) | NO   |     | NULL    |       |
+------------------+--------------+------+-----+---------+-------+

Другий варіант

Другий варіант трохи довший:

SELECT
  COLUMN_NAME, DATA_TYPE 
FROM
  INFORMATION_SCHEMA.COLUMNS 
WHERE
  TABLE_SCHEMA = 'db_name'
AND
  TABLE_NAME = 'table_name';

Він також менш балакучий:

+------------------+-----------+
| column_name      | DATA_TYPE |
+------------------+-----------+
| product_id       | int       |
| name             | varchar   |
| description      | text      |
| meta_title       | varchar   |
+------------------+-----------+

Він має перевагу в тому, що дозволяє вибирати кожен стовпчик, використовуючи AND COLUMN_NAME = 'column_name'(або like).


20

Щоб отримати типи даних усіх стовпців:

describe table_name

або лише один стовпець:

describe table_name column_name

Не знав, що ти можеш це зробити. Ви щойно врятували мені купу топтань інформаційної схеми.
Бетті Мок

11

Будь ласка, скористайтеся поданим нижче запитом mysql.

SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH 
FROM information_schema.columns 
WHERE table_schema = '<DATABASE NAME>' 
AND table_name = '<TABLE NAME>' 
AND COLUMN_NAME = '<COLOMN NAME>' 

Результат запиту MySql


Але це дасть лише максимальну довжину. Чи не краще використовувати SELECT DATA_TYPE, як пропонують інші відповіді?
Фабіо каже, що поверніть Моніку

Так, ти маєш рацію. Я просто забув його додати. Я зараз це виправляю. Спасибі
Прасант Кумар



2

Запит на пошук усіх типів стовпців, що використовуються в будь-якій базі даних

SELECT distinct DATA_TYPE FROM INFORMATION_SCHEMA.columns 
WHERE table_schema = '<db_name>' AND column_name like '%';

3
Не AND column_name like '%'зайвим?
Skippy le Grand Gourou

1

ПОКАЖИТИ КОЛИНИ З mytable

Самостійні повні приклади часто корисні.

<?php
  // The server where your database is hosted                 localhost
  // The name of your database                                mydatabase
  // The user name of the database user                       databaseuser
  // The password of the database user                        thesecretpassword
  // Most web pages are in utf-8 so should be the database    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
  try
  {
    $pdo = new PDO("mysql:host=localhost;dbname=mydatabase", "databaseuser", "thesecretpassword", array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));  
  }
    catch(PDOException $e)
  {
    die('Could not connect: ' . $e->getMessage());
  }

  $sql   = "SHOW COLUMNS FROM mytable";
  $query = $pdo->prepare($sql);
  $query->execute();

  $err = $query->errorInfo();
  $bug = $err[2];

  if ($bug != "") { echo "<p>$bug</p>"; }

  while ($row = $query->fetch(PDO::FETCH_ASSOC))
  {
    echo "<pre>" . print_r($row, true) . "</pre>";
  }

  /* OUTPUT SAMPLE  
  Array
  (
      [Field] => page_id
      [Type] => char(40)
      [Null] => NO
      [Key] => 
      [Default] => 
      [Extra] => 
  )

  Array
  (  
      [Field] => last_name
      [Type] => char(50)
      More ...
  */
?>

1
OP НЕ позначати це питання з phpтегом
Rotimi

1
ResultSet rs = Sstatement.executeQuery("SELECT * FROM Table Name");

ResultSetMetaData rsMetaData = rs.getMetaData();

int numberOfColumns = rsMetaData.getColumnCount();
System.out.println("resultSet MetaData column Count=" + numberOfColumns);

for (int i = 1; i <= numberOfColumns; i++) {
 System.out.println("column number " + i);

  System.out.println(rsMetaData.getColumnTypeName(i));
}

ОП не позначило це питання javaтегом.
Rotimi

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.