Metadata MySQL berfungsi untuk mendapatkan proyeksi jenis kolom dalam kueri?

7

Apakah mungkin untuk mendapatkan tipe bidang dari permintaan MySQL , dengan cara yang sama Anda bisa mendapatkannya dari tabel dengan SHOW COLUMNSperintah? Seperti dari tabel turunan,

SELECT x -- presumedMetaFn(x) -- returns "int"
FROM (
  SELECT 1 AS x
  UNION SELECT 2
) AS t;

Dengan kueri di atas, apakah ada fungsi atau sesuatu yang bisa saya gunakan untuk mendapatkan tipe x? PostgreSQL menyediakan ini dengan Fungsi Informasi Sistempg_typeof

SELECT x, pg_typeof(x)
FROM ( VALUES (1),(2) ) AS t(x);
 x | pg_typeof 
---+-----------
 1 | integer
 2 | integer
(2 rows)

Saya tidak mencari metadata di atas meja, tetapi dari hasil kueri. Dengan psqlpada PostgreSQL 11+, ini juga dimungkinkan dengan menjalankan \gdescsetelah kueri.

iHaveacomputer
sumber
Saya sangat menyarankan Anda memilih jawaban ini: dba.stackexchange.com/a/62262/2639 (yang merupakan satu-satunya cara untuk melakukannya dalam klien resmi) atau dba.stackexchange.com/a/203927/2639 (yang alamat C API). Jawaban yang dipilih, yang hanya membahas ikatan Perl dari perspektif pengguna tampaknya tidak menjadi topik di sini.
Evan Carroll

Jawaban:

11

Di dalam MySQL, Anda bisa mendapatkan informasi ini dengan membuat tabel sementara, lalu menggunakan DESCRIBEtabel sementara itu:

CREATE TEMPORARY TABLE `temp`
SELECT ...
FROM ...
LIMIT 0;

DESCRIBE `temp`;

Kita tidak bisa hanya menggunakan DESCRIBEtabel asli karena kolom yang ingin kita ketahui jenisnya adalah kolom terhitung, bukan sesuatu yang ditarik langsung dari tabel. Demikian juga, kami tidak dapat menggunakan DESCRIBEsecara langsung pada kueri, karena DESCRIBEhanya dapat digunakan pada tabel. Membuat tabel sementara memecahkan kedua masalah tersebut.

Brilliand
sumber
Ini persis apa yang saya cari, terima kasih.
Dean Chiu
3

Tidak ada cara yang sebanding untuk menyerahkan kueri ke MySQL dan memintanya untuk mengembalikan resultset yang berisi nama dan atribut kolom yang akan dikembalikan oleh kueri Anda ketika dieksekusi.

Namun, pustaka yang Anda gunakan untuk mengakses MySQL mungkin memiliki mekanisme yang bisa digunakan kode Anda ... karena pada saat itu, MySQL mengembalikan informasi ini ke klien dengan setiap kueri yang dieksekusi.

Sebagai contoh, perpustakaan DBD :: mysql di Perl mengembalikan array nama kolom dan tipe data.

Pegangan pernyataan yang dijalankan mengembalikan array nama kolom di @ {$ sth -> {NAME}} dan array tipe data kolom dalam @ {$ sth -> {mysql_type_name}}. Ia mendapatkan ini dari fungsi-fungsi yang disediakan oleh MySQL C API, yang (sejauh yang saya tahu) adalah kode dasar yang sama yang digunakan oleh banyak bahasa berbeda untuk pustaka MySQL mereka ... jadi saya berharap struktur serupa akan diekspos di lain lingkungan.

Michael - sqlbot
sumber
Perl mengetikkan ke MySQL C API melalui XS
Evan Carroll
0

Saya percaya data ini tersedia melalui API C dan didokumentasikan dalam Kode Tipe Pernyataan Disiapkan API C tetapi server tidak memiliki kemampuan untuk menyediakannya kepada pengguna akhir,

Anggota buffer_type MYSQL_BINDstruktur menunjukkan tipe data dari variabel bahasa C yang terikat pada parameter pernyataan atau kolom hasil yang ditetapkan. Untuk input, buffer_typetunjukkan jenis variabel yang berisi nilai yang akan dikirim ke server. Untuk output, ini menunjukkan jenis variabel di mana nilai yang diterima dari server harus disimpan.

Untuk tabel jenis SQL, dan nilai yang sesuai buffer_typelihat bagan ini.

Satu-satunya pekerjaan adalah untuk CREATE TEMPORARY TABLE AS SELECT (CTAS) ... DESCRIBE

Evan Carroll
sumber
-1

Pertanyaannya, ketika saya membacanya adalah tentang mendapatkan detail pada kolom di resultset, yang bertentangan dengan kolom tabel database.

Jika Anda menggunakan PHP, ada fungsi bawaan untuk mengakses database dengan MYSQLI dan PDO yang dapat memberi Anda informasi terperinci (tipe data dan sebagainya) tentang kolom dalam hasil kueri (sebagai lawan dari kolom tabel asli) .

Untuk detail tentang metode ini lihat dokumentasi PHP:

vidona
sumber