মাইএসকিউএল জিজ্ঞাসা কলামের নাম পেতে?


286

আমি কি পিএইচপি তে একটি মাইএসকিএল টেবিলের কর্নের নামগুলি একটি অ্যারে রূপে পেতে চাই?

এর জন্য কি কোন প্রশ্ন আছে?

উত্তর:


512

INFORMATION_SCHEMA মেটাডেটা ভার্চুয়াল ডাটাবেস ব্যবহার করা সবচেয়ে ভাল উপায় । বিশেষত INFORMATION_SCHEMA.COLUMNS টেবিল ...

SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' 
    AND `TABLE_NAME`='yourtablename';

এটি অত্যন্ত শক্তিশালী, এবং আপনাকে পাঠ্যকে পার্স করার প্রয়োজন ছাড়াই প্রচুর পরিমাণে তথ্য দিতে পারে (যেমন কলামের ধরণ, কলামটি প্রবিহীন কিনা, সর্বোচ্চ কলামের আকার, অক্ষর সেট ইত্যাদি) ...

ওহ, এবং এটি স্ট্যান্ডার্ড এসকিউএল (যেখানে SHOW ...মাইএসকিউএল নির্দিষ্ট এক্সটেনশন রয়েছে) ...

টেবিলগুলির মধ্যে পার্থক্য SHOW...এবং ব্যবহারের বিষয়ে আরও তথ্যের জন্য INFORMATION_SCHEMA, মাইএসকিউএল ডকুমেন্টেশনটি INFORMATION_SCHEMAসাধারণভাবে দেখুন ...


27
এটি কেবলমাত্র স্ট্যান্ডার্ড এসকিউএল যদি আপনি এই বোকা মাইএসকিএল-নির্দিষ্ট ব্যাকটিকগুলি টেবিলের নাম উদ্ধৃত না করেন। আমি তাদের ঘৃণা করি, তারা আমার কোডটিকে ভুল দেখায়।
মার্কআর

17
@ মার্কআরআর আমি উত্তরটি লেখার সময় আসলে এগুলিকে মূলত অন্তর্ভুক্ত করি নি। তবে তখন এটি কেবল কালো লেখার প্রাচীরের মতো লাগছিল। সুতরাং আমি সিনট্যাক্স হাইলাইটের সুবিধা নিতে ব্যাক-টিকগুলি যুক্ত করেছি। হ্যাঁ, আমি SET @@SESSION.sql_mode = 'ANSI_QUOTES';আগেও হাত পেতে পারি, তবে আমি সত্যি তা পছন্দ করি না। সনাক্তকারী সীমানার জন্য আমার ব্যাক-টিক্স নিয়ে কোনও সমস্যা নেই। আসলে, আমি তাদের ডাবল
উক্তিগুলির

2
উপরের উদাহরণে টেবিলের নামগুলি উদ্ধৃত করার প্রয়োজন নেই।
মার্কআর

20
@ মারকআর আমি জানি এটা না। এ কারণেই আমি বলেছিলাম যে আমি যখন উত্তরটি লিখি তখন আমি তাদের মূলত অন্তর্ভুক্ত করি না । সিনট্যাক্স হাইলাইট করার সুবিধা নেওয়ার জন্য আমি তাদের যুক্ত করেছি ...
ircmaxell

4
জেনে থাকুন যে ইনোডডিবি টেবিলের সাথে তথ্য_ছেমি থেকে নির্বাচন করুন খুব বেদনাদায়ক ধীর হতে পারে। কিছু সার্ভারে এক মিনিটেরও বেশি
majjohn

206

আপনি এমওয়াইএসকিউএল জন্য নিম্নলিখিত কোয়েরি ব্যবহার করতে পারেন:

SHOW columns FROM your-table;

নীচে উদাহরণ কোড রয়েছে যা দেখায় যে কলামগুলির নাম তালিকাভুক্ত করতে পিএইচপিতে উপরের সিনট্যাক্সটি কীভাবে প্রয়োগ করতে হবে:

$sql = "SHOW COLUMNS FROM your-table";
$result = mysqli_query($conn,$sql);
while($row = mysqli_fetch_array($result)){
    echo $row['Field']."<br>";
}

SHOW COLUMNS FROM TABLEভিজিট আউটপুট সম্পর্কে বিশদ জন্য: মাইএসকিউএল রেফারেন্স।


5
বা ... DESC TableName;;-)
ডাবল_জে

আরও প্রশ্নের জন্য অ্যারে সংরক্ষণ করার উপায় আছে? পঞ্চম কলামে মান পেতে $ সারি [4] এর জন্য ডাটাবেস অনুসন্ধান করতে চান?
ব্যবহারকারী 3866044

43

মনে হয় 2 টি উপায় আছে:

DESCRIBE `tablename`

অথবা

SHOW COLUMNS FROM `tablename`

DESCRIBEএখানে আরও : http://dev.mysql.com/doc/refman/5.0/en/describe.html


4
আহ, DESCRIBEকেবল একটি শর্টকাট SHOW COLUMNS FROM
পরাবাস্তব স্বপ্নগুলি

7
আর DESCএমনকি খাটো সরাসরি হয় DESCRIBE!
ব্রেট উইদমিয়ার

21

আমি অতীতে এটি করেছি।

SELECT column_name
FROM information_schema.columns
WHERE table_name='insert table name here'; 

14

সম্পাদনা : আজ আমি এটি করার আরও ভাল উপায় শিখেছি। দয়া করে ইরকমেক্সেলের উত্তর দেখুন।


এর আউটপুট পার্স করুন SHOW COLUMNS FROM table;

এখানে এটি সম্পর্কে আরও এখানে: http://dev.mysql.com/doc/refman/5.0/en/show-columns.html


7

mysql_fetch_field()সমস্ত কলামের ডেটা দেখতে ব্যবহার করুন । ম্যানুয়াল দেখুন ।

$query = 'select * from myfield';
$result = mysql_query($query);
$i = 0;
while ($i < mysql_num_fields($result))
{
   $fld = mysql_fetch_field($result, $i);
   $myarray[]=$fld->name;
   $i = $i + 1;
}

"সতর্কতা এই এক্সটেনশনটি পিএইচপি 5.5.0 হিসাবে অবচয় করা হয়েছে এবং ভবিষ্যতে সরানো হবে।"


2
mysqli_num_fields()এবং mysqli_fetch_field_direct()আপডেট হওয়া পদ্ধতিগুলি
গুস্টাভভ গিল

5

একটি পুরাতন পিএইচপি ফাংশন "mysql_list_fields ()" হ্রাস করা হয়েছে dep সুতরাং, আজ ক্ষেত্রের নাম পাওয়ার সর্বোত্তম উপায় হল একটি কোয়েরি "সারণী_নাম থেকে [দেখান 'নাম' পছন্দ করুন]" query সুতরাং, এখানে একটি সামান্য উদাহরণ:

$fields = array();
$res=mysql_query("SHOW COLUMNS FROM mytable");
while ($x = mysql_fetch_assoc($res)){
  $fields[] = $x['Field'];
}
foreach ($fields as $f) { echo "<br>Field name: ".$f; }

4
function get_col_names(){  
    $sql = "SHOW COLUMNS FROM tableName";  
    $result = mysql_query($sql);     
    while($record = mysql_fetch_array($result)){  
     $fields[] = $record['0'];  
    }
    foreach ($fields as $value){  
      echo 'column name is : '.$value.'-';  
}  
 }  

return get_col_names();

4

আপনি এটি যা খুঁজছিলেন তা নিশ্চিত কিনা তা নিশ্চিত নয় তবে এটি আমার পক্ষে কাজ করেছে:

$query = query("DESC YourTable");  
$col_names = array_column($query, 'Field');

এটি আপনার টেবিলের কলামের নাম / পরিবর্তনশীল নামগুলির একটি সহজ অ্যারে বা স্ট্রিং হিসাবে অ্যারে প্রদান করে, যা মাইএসকিউএল কোয়েরিগুলি গতিশীলরূপে গড়ে তুলতে আমার প্রয়োজন ছিল। আমার হতাশার বিষয়টি হ'ল আমি পিএইচপি তে অ্যারেগুলি কীভাবে খুব ভালভাবে সূচনা করতে পারি তা সহজভাবে জানি না, তাই DESC বা শো থেকে ফলাফলগুলি নিয়ে কী করা যায় তা আমি নিশ্চিত ছিলাম না। আশা করি আমার উত্তরটি আমার মতো নতুনদের পক্ষে সহায়ক!

ফলাফল যাচাই করতে: print_r($col_names);


4

আপনি যখন কিছু দায়ের করে আপনার সমস্ত টেবিল কাঠামো পরীক্ষা করতে চান তখন এই কোডটি ব্যবহার করুন। এই ক্যোয়ারিতে আমি আরও তথ্যের জন্য কলাম_নাম, কলাম_প্রকার এবং টেবিল_নামটি নির্বাচন করি। আমি কলাম_প্রকার অনুসারে অর্ডার ব্যবহার করি যাতে আমি এটি সহজে দেখতে পারি।

SELECT `COLUMN_NAME`,COLUMN_TYPE,TABLE_NAME 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' order by DATA_TYPE;

আপনি যদি কেবলমাত্র ডাবল প্রকার দায়ের করা চেক করতে চান তবে আপনি এটি সহজেই করতে পারেন

SELECT `COLUMN_NAME`,COLUMN_TYPE,TABLE_NAME,DATA_TYPE 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' AND DATA_TYPE like '%bigint%'  order by DATA_TYPE;

এখানে চিত্র বর্ণনা লিখুন

আপনি যদি কোন ক্ষেত্রটি নাল টাইপ ইত্যাদি অনুমতি দেয় তা পরীক্ষা করতে চান তবে আপনি এটি ব্যবহার করতে পারেন

SELECT `COLUMN_NAME`,COLUMN_TYPE,TABLE_NAME,IS_NULLABLE,DATA_TYPE 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' and DATA_TYPE like '%bigint%' and IS_NULLABLE ='NO' order by COLUMN_TYPE;

এখানে চিত্র বর্ণনা লিখুন

আপনি আরও চেক করতে চান তবে থিক লিঙ্কটি আপনাকে সহায়তা করবে।

https://dev.mysql.com/doc/refman/5.7/en/columns-table.html


ভাল. খুব উপকারী.
সাজ্জাদ হিশাইন খান

3

মাইএসকিএল 5.1 (5.5 নয়) এর কলম্বগুলি দেখান একটি অস্থায়ী ডিস্ক টেবিল ব্যবহার করে।

সুতরাং এটি কিছু ক্ষেত্রে ধীর বিবেচনা করা যেতে পারে। কমপক্ষে, এটি আপনার তৈরি_টিএমপি_ডিস্ক _ টেবিলের মানটিকে দ্বিগুণ করতে পারে। প্রতি সংযোগে বা প্রতিটি পৃষ্ঠার অনুরোধের জন্য একটি অস্থায়ী ডিস্ক সারণী কল্পনা করুন।

দেখান COLUMNS আসলে এত ধীর নয়, সম্ভবত এটি ফাইল সিস্টেম ক্যাশে ব্যবহার করে। Phpmyadmin ধারাবাহিকভাবে 0.5 ডলার বলে। এটি ওয়ার্ডপ্রেস পৃষ্ঠা পরিবেশনার 500ms-1000ms এর সাথে তুলনা করে কিছুই নয়। কিন্তু তবুও, এটি গুরুত্বপূর্ণ সময় আছে। একটি ডিস্ক সিস্টেমের জড়িততা রয়েছে, আপনি কখনই জানেন না যে সার্ভার ব্যস্ত থাকাকালীন কী হয়, ক্যাশে পূর্ণ হয়, এইচডিডি বন্ধ থাকে ইত্যাদি etc.

নির্বাচন থেকে * কলামের মাধ্যমে নামগুলি পুনরুদ্ধার করা হচ্ছে ... LIMIT 1 ছিল প্রায় ~ 0.1ms, এবং এটি কোয়েরি ক্যাশেও ব্যবহার করতে পারে।

সুতরাং যদি সম্ভব হয় তবে কলাম প্রদর্শন না করে কোনও টেবিল থেকে কলামের নাম পাওয়ার জন্য আমার সামান্য অনুকূলিত কোডটি এখানে রয়েছে :

function db_columns_ar($table)
{
//returns Array('col1name'=>'col1name','col2name'=>'col2name',...)
if(!$table) return Array();
if(!is_string($table)) return Array();

global $db_columns_ar_cache;
if(!empty($db_columns_ar_cache[$table]))
    return $db_columns_ar_cache[$table];


//IMPORTANT show columns creates a temp disk table
$cols=Array();
$row=db_row_ar($q1="SELECT * FROM `$table` LIMIT 1");
if($row)
    {
    foreach($row as $name=>$val)
        $cols[$name]=$name;
    }
else
    {
    $coldata=db_rows($q2="SHOW COLUMNS FROM `$table`");
    if($coldata)
        foreach($coldata as $row)
            $cols[$row->Field]=$row->Field;
    }
$db_columns_ar_cache[$table]=$cols;
//debugexit($q1,$q2,$row,$coldata,$cols);
return $cols;
}

মন্তব্য:

  • যতক্ষণ না আপনার টেবিলগুলিতে প্রথম সারিতে মেগাবাইটের পরিসীমা ডেটা থাকে না, ততক্ষণ তা ঠিকঠাক কাজ করা উচিত।
  • আপনার নির্দিষ্ট ডাটাবেস সেটআপের সাথে ফাংশনটির নাম db_rows এবং db_row_ar প্রতিস্থাপন করা উচিত।

হাই জোহান!
কার্লোসফন্টানা

এর জন্য দুঃখিত, আমি এটি পাঠ্যে পরিষ্কার করব will এটি একটি কাল্পনিক ফাংশন নাম ছিল, আপনার ডাটাবেস ক্লাস বা সেটআপ সেই ধরণের জিনিসের জন্য যা ব্যবহার করে তার জন্য দাঁড়িয়ে।
জোহান

3

এটি ব্যবহার করে দেখুন আমি ব্যক্তিগতভাবে এটি ব্যবহার করি:

SHOW COLUMNS FROM $table where field REGEXP 'stock_id|drug_name' 

1
আপনি কেবল কলামের নামগুলি "স্টক_আইডি" এবং "ড্রাগ_নাম" কেন নির্বাচন করছেন?
ফ্রাঙ্ক ব্রাইস

আমার জন্য কাজ করেছেন কিন্তু "যেখানে ..." জিনিসগুলি ছাড়াই। PDO সহ: $ this-> dbHandle = নতুন PDO (...); $ ক্যোয়ারী = 'কলম্বস থেকে দেখান'। $ tablename; $ stmt = $ this-> dbHandle-> ক্যোয়ারী ($ কোয়েরি); $ ফলাফল = $ stmt-> ফেচআল (PDO :: FETCH_ASSOC); foreach ($ ফলে $ ফলাফল) {// প্রতিটি $ ফলাফল নিয়ে কিছু}
Zaphoid

2

ওয়ার্ডপ্রেসে:

global $wpdb;   $table_name=$wpdb->prefix.'posts';
foreach ( $wpdb->get_col( "DESC " . $table_name, 0 ) as $column_name ) {
  var_dump( $column_name );
}

2

এই প্রশ্নটি পুরানো, তবে আমি এখানে একটি প্রদত্ত ক্যোয়ারীটির ক্ষেত্রের নামগুলি গতিশীল উপায়ে (অগত্যা কেবলমাত্র কোনও টেবিলের ক্ষেত্রগুলি নয়) সন্ধানের জন্য একটি উপায় অনুসন্ধান করতে এসেছি। এবং যেহেতু লোকেরা অন্যান্য সম্পর্কিত প্রশ্নে প্রদত্ত কার্যটির উত্তর হিসাবে এটিকে নির্দেশ করে চলেছে, আমি গ্যাভিন সিম্পসনের টিপস ব্যবহার করে এটি যেভাবে সম্পন্ন করতে পেলাম তা ভাগ করে নিচ্ছি:

//Function to generate a HTML table from a SQL query
function myTable($obConn,$sql)
{
    $rsResult = mysqli_query($obConn, $sql) or die(mysqli_error($obConn));
    if(mysqli_num_rows($rsResult)>0)
    {
        //We start with header. >>>Here we retrieve the field names<<<
        echo "<table width=\"100%\" border=\"0\" cellspacing=\"2\" cellpadding=\"0\"><tr align=\"center\" bgcolor=\"#CCCCCC\">";
        $i = 0;
        while ($i < mysqli_num_fields($rsResult)){
           $field = mysqli_fetch_field_direct($rsResult, $i);
           $fieldName=$field->name;
           echo "<td><strong>$fieldName</strong></td>";
           $i = $i + 1;
        }
        echo "</tr>"; 
        //>>>Field names retrieved<<<

        //We dump info
        $bolWhite=true;
        while ($row = mysqli_fetch_assoc($rsResult)) {
            echo $bolWhite ? "<tr bgcolor=\"#CCCCCC\">" : "<tr bgcolor=\"#FFF\">";
            $bolWhite=!$bolWhite;
            foreach($row as $data) {
                echo "<td>$data</td>";
            }
            echo "</tr>";
        }
        echo "</table>";
    }
}

কোনও অ্যারেতে ক্ষেত্রের নামগুলি সন্নিবেশ করানোর জন্য এটি সহজেই সংশোধন করা যায়।

একটি সাধারণ ব্যবহার: $sql="SELECT * FROM myTable LIMIT 1"আপনাকে কোনও টেবিলের ক্ষেত্রগুলি দিতে পারে, প্রয়োজন না SHOW COLUMNSপড়লে বা কোনও অতিরিক্ত পিএইচপি মডিউল ছাড়াই , প্রয়োজন হয় (ডেটা ডাম্প অংশটি অপসারণ)।

আশা করি এটি অন্য কাউকে সহায়তা করবে।


2

যদি আপনি পিএইচপি ব্যবহার করেন তবে এই টুকরোটিটি ব্যবহার করুন ।

এটি কোনও ফলাফল ছাড়াই নির্বাচিত ক্ষেত্রগুলির পুরো তথ্য এবং সমস্ত কাস্টম ক্ষেত্র যেমন:

SELECT a.name aname, b.name bname, b.* 
FROM table1 a LEFT JOIN table2 b
ON a.id = b.pid;

উপরে যদি বর্গ বর্গ কোনও তথ্য না দেয় তবে ক্ষেত্রের নামগুলিও নাম , নাম , বি এর অন্যান্য ক্ষেত্রের নামটি পাবেন get

মাত্র দুটি লাইন:

$query_info = mysqli_query($link, $data_source);
$fetch_fields_result = $query_info->fetch_fields();

2

এই কোয়েরিতে কোনও টেবিলের নাম উল্লেখ না করেই একটি ডাটাবেসে সমস্ত কলামের একটি তালিকা পাওয়া যায়। এটি কেবলমাত্র কলামের নামের তালিকা দেয়:

SELECT COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE table_schema = 'db_name'

যাইহোক, যখন আমি phpmyadmin এ এই ক্যোয়ারী চালিয়েছি, এটি ত্রুটিগুলির একটি সিরিজ প্রদর্শন করেছে। তবুও, এটি কাজ করে। তাই সাবধানতার সাথে এটি ব্যবহার করুন।


2

সমস্ত উত্তরগুলির মধ্যে সহজ সমাধান:

DESC `table name`

অথবা

DESCRIBE `table name`

অথবা

SHOW COLUMNS FROM `table name`

2

আপনার যদি কেবলমাত্র ক্ষেত্রের নাম এবং প্রকারের প্রয়োজন হয় (সম্ভবত এক্সেলের সহজে অনুলিপি-পেস্ট করার জন্য):

SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA='databasenamegoeshere'
AND DATA_TYPE='decimal' and TABLE_NAME = 'tablenamegoeshere'

অপসারণ

DATA_TYPE='decimal'

আপনি যদি সমস্ত ডেটা প্রকার চান


1

আমি কোন বিশেষজ্ঞ নই, তবে এটি আমার পক্ষে কাজ করে ..

$sql = "desc MyTable";
$result = @mysql_query($sql);
while($row = @mysql_fetch_array($result)){
    echo $row[0]."<br>"; // returns the first column of array. in this case Field

      // the below code will return a full array-> Field,Type,Null,Key,Default,Extra    
      // for ($c=0;$c<sizeof($row);$c++){echo @$row[$c]."<br>";}    

}

0

আমি এসকিউএল সার্ভারে এই ক্যোয়ারীটি চেষ্টা করেছি এবং এটি আমার জন্য কাজ করেছে:

SELECT name FROM sys.columns WHERE OBJECT_ID = OBJECT_ID('table_name')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.