จะรับประเภทข้อมูลคอลัมน์ตาราง mysql ได้อย่างไร


111

ฉันต้องการรับประเภทข้อมูลคอลัมน์ของตาราง mysql

คิดว่าฉันสามารถใช้MYSQLFIELDโครงสร้างได้ แต่เป็นประเภทฟิลด์ที่แจกแจง

จากนั้นฉันก็ลองด้วย mysql_real_query()

ข้อผิดพลาดที่ฉันได้รับคือ query was empty

ฉันจะรับประเภทข้อมูลคอลัมน์ได้อย่างไร

คำตอบ:


122

คุณสามารถใช้ตารางคอลัมน์ information_schema :

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

9
อย่าลืม: AND INDEX_SCHEMA = 'database_name'
Inshallah

ฉันได้ลองใช้สิ่งนี้เป็นการส่วนตัวและยอมรับว่าคำตอบนี้ทำในสิ่งที่ OP ตั้งใจจะทำ อีกด้านสังเกตแปลก ๆ ว่า "table_name" เป็นตัวพิมพ์ใหญ่ขนาดเล็กในคู่มือได้อย่างไรไม่ควรเป็น UPPER หรือไม่? (ไม่ใช่ว่าสร้างความแตกต่าง)
chutsu

8
โปรดทราบด้วยว่าชนิดข้อมูลมีความยาวที่กำหนดไว้หรือไม่เช่น VARCHAR (50) สามารถใช้SELECT COLUMN_TYPEเพื่อรับข้อมูลเพิ่มเติมได้
chutsu

11
ถ้า INDEX_SCHEMA ไม่ทำงานให้ลอง TABLE_SCHEMA = 'database_name'
senK

2
แบบสอบถามนี้จะไร้ประโยชน์เมื่อคุณต้องการทราบชนิดสำหรับคอลัมน์ทั้งหมด (ลบAND COLUMN_NAME = 'col_name') SELECT COLUMN_NAME, DATA_TYPE FROM etc.เว้นแต่คุณจะแสดงชื่อคอลัมน์:
Skippy le Grand Gourou

81

แบบสอบถามด้านล่างแสดงรายการข้อมูลเกี่ยวกับแต่ละเขตข้อมูลรวมถึงประเภทเขตข้อมูล MySQL นี่คือตัวอย่าง:

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

ดูหน้าคู่มือนี้


21
อีกทางเลือกหนึ่งคือ EXPLAIN tablename;
hobodave

1
คำตอบนี้ต้องการการจัดการเพิ่มเติมเพื่อให้ได้ประเภท ... คำตอบที่ user83591 ให้นั้นดีกว่ามาก
chutsu

เพิ่มWHERE FIELD = '<your column name>'หากคุณต้องการข้อมูลคอลัมน์เดียว
Placid

40

คำตอบส่วนใหญ่ซ้ำกันอาจเป็นประโยชน์ในการจัดกลุ่ม โดยทั่วไปมีการเสนอตัวเลือกง่ายๆสองตัวเลือก

ตัวเลือกแรก

ตัวเลือกแรกมี 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)


21

ในการรับประเภทข้อมูลของคอลัมน์ทั้งหมด:

describe table_name

หรือเพียงคอลัมน์เดียว:

describe table_name column_name

ไม่ทราบว่าคุณสามารถทำได้ คุณเพิ่งช่วยฉันหลายอย่างผ่านสคีมาข้อมูล
Betty Mock

13

โปรดใช้แบบสอบถาม 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ตามคำตอบอื่น ๆไม่ดีกว่าเหรอ
Fabio กล่าว Reinstate Monica

ใช่คุณถูก. ฉันลืมที่จะเพิ่มมัน ตอนนี้ฉันได้รับการแก้ไขแล้ว ขอบคุณ
Prasant Kumar


4

ขั้นแรกให้เลือกฐานข้อมูลโดยใช้use testDB;จากนั้นดำเนินการ

desc `testDB`.`images`;
-- or
SHOW FIELDS FROM images;

เอาท์พุต:

รับคอลัมน์ตารางด้วย DataTypes


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));
}

OP ไม่ได้ติดแท็กคำถามนี้ด้วยjavaแท็ก
Rotimi

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.