Giải pháp: INFORMATION_SCHEMA.COLUMNS
View hệ thống INFORMATION_SCHEMA.COLUMNS chứa metadata về tất cả cột trong database.
Ví dụ minh họa
Tạo bảng và dữ liệu
mysql> CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(20)
);
mysql> INSERT INTO DemoTable(Name) VALUES('Chris');
mysql> INSERT INTO DemoTable(Name) VALUES('Robert');
mysql> INSERT INTO DemoTable(Name) VALUES('Sam');
Truy vấn kết hợp dữ liệu và kiểu dữ liệu
mysql> SELECT DemoTable.Name, col1.DATA_TYPE
-> FROM DemoTable, INFORMATION_SCHEMA.COLUMNS col1
-> WHERE col1.TABLE_NAME = 'DemoTable'
-> AND col1.COLUMN_NAME = 'Name';
Kết quả
+--------+-----------+ | Name | DATA_TYPE | +--------+-----------+ | Chris | varchar | | Robert | varchar | | Sam | varchar | +--------+-----------+
Giải thích truy vấn
INFORMATION_SCHEMA.COLUMNS: View chứa thông tin cộtTABLE_NAME = 'DemoTable': Lọc theo tên bảngCOLUMN_NAME = 'Name': Lọc theo tên cột- Cross join ngầm giữa bảng dữ liệu và metadata (mỗi dòng dữ liệu ghép với cùng một metadata)
Cách tốt hơn: JOIN tường minh
SELECT d.Name, c.DATA_TYPE, c.CHARACTER_MAXIMUM_LENGTH, c.IS_NULLABLE
FROM DemoTable d
JOIN INFORMATION_SCHEMA.COLUMNS c
ON c.TABLE_SCHEMA = DATABASE()
AND c.TABLE_NAME = 'DemoTable'
AND c.COLUMN_NAME = 'Name';
Các cột hữu ích trong COLUMNS
| Cột | Ý nghĩa |
|---|---|
| DATA_TYPE | Kiểu dữ liệu (int, varchar, datetime...) |
| CHARACTER_MAXIMUM_LENGTH | Độ dài tối đa (cho string) |
| NUMERIC_PRECISION / SCALE | Độ chính xác (cho số) |
| IS_NULLABLE | YES/NO cho phép NULL |
| COLUMN_DEFAULT | Giá trị mặc định |
| COLUMN_KEY | PRI, UNI, MUL (khóa) |
| EXTRA | auto_increment, etc. |
Lưu ý
Cách này chủ yếu dùng cho công cụ quản trị, debug, hoặc dynamic SQL. Trong ứng dụng bình thường, kiểu dữ liệu đã biết trước qua schema.