Trong MySQL, LOAD_FILE()
hàm đọc một tệp và trả về nội dung của nó dưới dạng một chuỗi.
Cú pháp
Cú pháp như sau:
LOAD_FILE(file_name)
Ở đâu file_name
là đường dẫn đầy đủ đến tệp.
Ví dụ
Dưới đây là một ví dụ mà tôi chọn nội dung từ một tệp:
SELECT LOAD_FILE('/data/test.txt') AS Result;
Kết quả:
+------------------------------------------+ | Result | +------------------------------------------+ | This text is all that the file contains! | +------------------------------------------+
Một ví dụ về cơ sở dữ liệu
Dưới đây là ví dụ về một truy vấn có thể trông như thế nào khi chèn nội dung của tệp vào cơ sở dữ liệu:
INSERT INTO MyTable (FileId, UserId, MyBlobColumn) VALUES (1, 20, LOAD_FILE('/data/test.txt'));
Trong trường hợp này, cột MyBlobColumn
có kiểu dữ liệu BLOB (cho phép nó lưu trữ dữ liệu nhị phân).
Và bây giờ nó đã có trong cơ sở dữ liệu, chúng tôi có thể chọn nó:
SELECT MyBlobColumn FROM MyTable WHERE UserId = 20;
Kết quả:
+------------------------------------------+ | MyBlobColumn | +------------------------------------------+ | This text is all that the file contains! | +------------------------------------------+
Nếu tệp không tồn tại
Nếu tệp không tồn tại, NULL được trả lại:
SELECT LOAD_FILE('/data/oops.txt') AS Result;
Kết quả:
+--------+ | Result | +--------+ | NULL | +--------+
Thêm lý do bạn có thể nhận được NULL
Bạn cũng sẽ nhận được NULL một trong các điều kiện sau không được đáp ứng:
- Tệp phải được đặt trên máy chủ lưu trữ.
- Bạn phải có
FILE
đặc quyền để đọc tệp. Người dùng cóFILE
đặc quyền có thể đọc bất kỳ tệp nào trên máy chủ lưu trữ mà máy chủ MySQL có thể đọc được trên toàn thế giới hoặc có thể đọc được bởi máy chủ MySQL. - Tất cả mọi người đều phải đọc được tệp và kích thước của tệp nhỏ hơn
max_allowed_packet
byte. Đây là cách bạn có thể kiểm tra điều đó:SHOW VARIABLES LIKE 'max_allowed_packet';
Kết quả của tôi:
+--------------------+----------+ | Variable_name | Value | +--------------------+----------+ | max_allowed_packet | 67108864 | +--------------------+----------+
- Nếu
secure_file_priv
biến hệ thống được đặt thành tên thư mục khác, tệp được tải phải nằm trong thư mục đó. Dưới đây là cách bạn có thể kiểm tra rằng:SHOW VARIABLES LIKE 'secure_file_priv';
Kết quả của tôi:
+------------------+--------+ | Variable_name | Value | +------------------+--------+ | secure_file_priv | /data/ | +------------------+--------+
Trong ví dụ này, tôi chỉ có thể đọc các tệp từ / data / thư mục.